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的正确方法是什么.我不需要它来读取文件或返回它,我只需要true或false值.
这是实现它的一种方法:
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)
接受的答案适用于小型收藏。
一对大集合更快的方法是简单地使用:
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)