检查带有mongoose的集合中是否存在ID

Mic*_*ael 24 mongoose mongodb node.js

例如,我有一个集合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);
Run Code Online (Sandbox Code Playgroud)

然后我有一个ID:

var userID = "some-user-id"
Run Code Online (Sandbox Code Playgroud)

检查User集合中是否存在此ID的正确方法是什么.我不需要它来读取文件或返回它,我只需要truefalse值.

这是实现它的一种方法:

User.findOne({
     _id: userID
}, function (err, existingUser) {
Run Code Online (Sandbox Code Playgroud)

但是有更快更有效的方式吗?

Ale*_*lex 55

使用count而不是findOne.

这将(引擎盖下)导致猫鼬使用find:http://docs.mongodb.org/manual/reference/method/db.collection.count

findOne()将读取+返回文档(如果存在)另一方面,find()只返回一个光标(或不返回),只有在迭代光标时才读取数据.所以在我们的例子中,我们不会迭代光标,只计算返回的结果.

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

  • `count`现在触发一个警告:"DeprecationWarning:`collection.count`已被弃用,并将在以后的版本中删除.使用`collection.countDocuments`或`collection.estimatedDocumentCount`代替". (7认同)
  • 其实."在引擎盖下"这使用`.count()`方法.这是一种特定的方法,通常是最佳方式.尽管`.count()`实际上是`.find()`游标返回的"修饰符",但实际上最好解释这一点而不是让它隐藏起来. (3认同)

Ali*_*son 8

接受的答案适用于小型收藏。

对大集合更快的方法是简单地使用:

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...
    }
});
Run Code Online (Sandbox Code Playgroud)

它不会返回所有字段。我相信他们目前正在开发一项新功能来支持你(和我)想要的。


与此同时,您可以创建一个插件,非常简单且可重用。

any.js使用以下代码创建一个文件:

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;
      };
  }
Run Code Online (Sandbox Code Playgroud)

然后在你的模型中你这样做:

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);
Run Code Online (Sandbox Code Playgroud)

...并像这样使用它:

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...
    }
});
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 6

您现在可以像这样User.exists()2019年9月开始使用:

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

文档

在引擎盖下,MyModel.exists({ answer: 42 })相当于 MyModel.findOne({ answer: 42 }).select({ _id: 1 }).lean().then(doc => !!doc)

  • 尝试在预保存挂钩中使用它,但获取存在不是函数 mongoose - 5.7.13 (2认同)