How to exclude one particular field from a collection in Mongoose?

JavascriptMongodbMongooseMongodb Query

Javascript Problem Overview


I have a NodeJS application with Mongoose ODM(Mongoose 3.3.1). I want to retrieve all fields except 1 from my collection.For Example: I have a collection Product Which have 6 fields,I want to select all except a field "Image" . I used "exclude" method, but got error.. This was my code.

    var Query = models.Product.find();
    Query.exclude('title Image');

    if (req.params.id) {
        Query.where('_id', req.params.id);
    }


    Query.exec(function (err, product) {
        if (!err) {
            return res.send({ 'statusCode': 200, 'statusText': 'OK', 'data': product });
        } else {
            return res.send(500);
        }
    });

But this returns error

Express
500 TypeError: Object #<Query> has no method 'exclude'.........

Also I tried, var Query = models.Product.find().exclude('title','Image'); and var Query = models.Product.find({}).exclude('title','Image'); But getting the same error. How to exclude one/(two) particular fields from a collection in Mongoose.

Javascript Solutions


Solution 1 - Javascript

Use query.select for field selection in the current (3.x) Mongoose builds.

Prefix a field name you want to exclude with a -; so in your case:

Query.select('-Image');

Quick aside: in JavaScript, variables starting with a capital letter should be reserved for constructor functions. So consider renaming Query as query in your code.

Solution 2 - Javascript

I don't know where you read about that .exclude function, because I can't find it in any documentation.

But you can exclude fields by using the second parameter of the find method.

Here is an example from the official documentation:

db.inventory.find( { type: 'food' }, { type:0 } )

> This operation returns all documents where the value of the type field is food, but does not include the type field in the output.

Solution 3 - Javascript

Model.findOne({ _id: Your Id}, { password: 0, name: 0 }, function(err, user){
  // put your code
});

this code worked in my project. Thanks!! have a nice day.

Solution 4 - Javascript

You could do this

const products = await Product.find().select(['-image'])

Solution 5 - Javascript

I am use this with async await

async (req, res) => {
      try { 
        await User.findById(req.user,'name email',(err, user) => {
          if(err || !user){
            return res.status(404)
          } else {
            return res.status(200).json({
              user,
            });
          }
        });
      } catch (error) {
        console.log(error);
      }

Solution 6 - Javascript

In the updated version of Mongoose you can use it in this way as below to get selected fields.

user.findById({_id: req.body.id}, 'username phno address').then(response => {
  res.status(200).json({
    result: true,
    details: response
  });
}).catch(err => {
  res.status(500).json({ result: false });
});

Solution 7 - Javascript

I'm working on a feature. I store a userId array name "collectedUser" than who is collected the project. And I just want to return a field "isCollected" instead of "collectedUsers". So select is not what I want. But I got this solution.

This is after I get projects from database, I add "isCollected".

for (const item of projects) {
    item.set("isCollected", item.collectedUsers.includes(userId), {
        strict: false,
    })
}

And this is in Decorator @Schema

@Schema({
timestamps: true,
toObject: {
    virtuals: true,
    versionKey: false,
    transform: (doc, ret, options): Partial<Project> => {
        return {
            ...ret,
            projectManagers: undefined,
            projectMembers: undefined,
            collectedUsers: undefined
        }
    }
}
})

Finally in my controller

projects = projects.map(i => i.toObject())

It's a strange tricks that set undefined, but it really work.

Btw I'm using nestjs.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondanyView Question on Stackoverflow
Solution 1 - JavascriptJohnnyHKView Answer on Stackoverflow
Solution 2 - JavascriptPhilippView Answer on Stackoverflow
Solution 3 - JavascriptDanieldmsView Answer on Stackoverflow
Solution 4 - JavascriptAdityaView Answer on Stackoverflow
Solution 5 - JavascriptAlfredo IzquierdoView Answer on Stackoverflow
Solution 6 - JavascriptSaiSuryaView Answer on Stackoverflow
Solution 7 - JavascriptpppppuView Answer on Stackoverflow