Mongoose查询,其中Object Id为空?

时间:2014-12-16 21:01:42

标签: mongoose

如何搜索未设置.findOne字段的ObjectId文档?我找不到是否应该在nullundefined或其他内容上搜索。

在下面的示例中,我试图找到一个文档,其中包含" email" value已知但userId尚未设置:

var joinRequest = new mongoose.Schema({
    email: { type: String, unique: true, lowercase: true, trim: true },
    code: { type: String, uppercase: true, trim: true, select: false  },
    lastSent: { type: Date },
    userId: { type: mongoose.Schema.Types.ObjectId, select: false }
});

然后,ObjectId字段是否可以为空?我应该在这里使用String吗?

1 个答案:

答案 0 :(得分:4)

MongoDB上下文中undefined的几点内容

不存储值为undefined的属性。所以以下内容没有a属性

db.insert({a : undefined})

但是对于数组,undefined值将转换为null

db.insert({a : [undefined]}) //stores {a : [null]}

undefined在用作条件

时也有奇怪的行为
db.users.find({a : undefined}) //finds everything
db.users.findOne({a : undefined}) //always returns the first document (which is a problem for you)
db.users.update({a : undefined}, {a : true}) //only updates documents with no a property

所以我会避免使用undefined并可能假装它甚至不存在。请使用null,因为它已存储,有时不会被删除作为条件。

所以例如

db.users.insert({email : "email@domain.com", userID : null});
db.users.findOne({email : "email@domain.com", userID : null});

如果您决定使用undefined,尽管这样做

db.users.insert({email : "email@domain.com"});
db.users.findOne({email : "email@domain.com", userID : { exists : false }}); //works for null as well

http://docs.mongodb.org/manual/reference/operator/query/exists/