Check if ID exists in a collection with mongoose

…衆ロ難τιáo~ 提交于 2021-02-05 14:47:50

问题


For instance, I have a collection User:

var mongoose = require('mongoose');

var UserSchema = new mongoose.Schema({
    email: String,
    googleId: String,
    facebookId: String,
    displayName: String,
    active: Boolean
});

module.exports = mongoose.model('User', UserSchema);

And then I have an ID:

var userID = "some-user-id"

What is the right way to just check if this id exists in the User collection. I don't need it to read the file or return it, I just need the true or false value.

Here is one way to achieve it:

User.findOne({
     _id: userID
}, function (err, existingUser) {

But is there faster and more efficient way?


回答1:


Use count rather than findOne.

This will (under the hood) cause mongoose to use find : http://docs.mongodb.org/manual/reference/method/db.collection.count

findOne() will read + return the document if it exists On the other hand, find() just returns a cursor (or not) and only reads the data if you iterate over the cursor. So in our case, we're not iterating over the cursor, merely counting the results returned.

User.count({_id: userID}, function (err, count){ 
    if(count>0){
        //document exists });
    }
}); 



回答2:


You can now use User.exists() as of September 2019 like so:

const doesUserExit = await User.exists({ _id: userID });

From the docs:

Under the hood, MyModel.exists({ answer: 42 }) is equivalent to MyModel.findOne({ answer: 42 }).select({ _id: 1 }).lean().then(doc => !!doc)




回答3:


The accepted answer is fine for small collections.

A faster way on larger collections is to simply use this:

const result = await User.findOne({ _id: userID }).select("_id").lean();
if (result) {
    // user exists...
}

// or without "async/await":

User.findOne({ _id: userID }).select("_id").lean().then(result => {
    if (result) {
        // user exists...
    }
});

It won't return all fields. I believe they are currently working on a new feature to support what you (and I) want.


In the meantime you could create a plugin, very simple and reusable.

Create an any.js file with this code:

module.exports = function any(schema, options) {
    schema.statics.any = async function (query) {
        const result = await this.findOne(query).select("_id").lean();
        return result ? true : false;
      };
  }

Then in your model you do this:

var mongoose = require('mongoose');
const any = require('./plugins/any'); // I'm assuming you created a "plugins" folder for it

var UserSchema = new mongoose.Schema({
    email: String,
    googleId: String,
    facebookId: String,
    displayName: String,
    active: Boolean
});

UserSchema.plugin(any);
module.exports = mongoose.model('User', UserSchema);

...and use it like this:

const result = await User.any({ _id: userID });
if (result) {
    // user exists...
}

// or without using "async/await":

User.any({ _id: userID }).then(result => {
    if (result) {
        // user exists...
    }
});



回答4:


OR you can simply use exists function, without making any async/await:

myData = {_id: userID};

User.exists(myData,(error, result)=>{
    if (error){
      console.log(error)
    } else {
      console.log("result:", result)  //result is true if myData already exists
    }
  });

You can play with the result now!




回答5:


User.exists({ _id: userID }).then(exists => {
  if (exists) {
    res.redirect('/dashboard')
  } else {
    res.redirect('/login')
  }
})

More info can be found at Mongoose docs.



来源:https://stackoverflow.com/questions/27482806/check-if-id-exists-in-a-collection-with-mongoose

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!