我有一个包含嵌入文档数组的模型。
var CourseSchema = mongoose.Schema({
invitations: [InvitationSchema],
total:Number
});
var InvitationSchema = new mongoose.Schema({
token: { type:String, required: true},
email: String
});
希望通过匹配来自请求的邀请嵌入式数组的令牌来更新/增加邀请总数,这里我遵循了http://diogogmt.wordpress.com/2012/03/23/update-elementmatch-and-the-positional-operator-on-mongodbmongoose/中的教程
所以我试过
var options = { new: false , select:'_id'};
CourseModel.update({'_id':id,'invitations':{'$elemMatch':{'token':token}}},{'$inc':{'total':1}},options,function(err,data) {
if(err){callback(err, null);}
else{
callback(null, data);
}
})
但它不起作用,如果我删除'邀请':{'$ elemMatch':{'token':token}},查询将起作用
答案 0 :(得分:1)
根据documentation $ elemMatch只能用于投影。但是我找到了example,它说明了$ elemMatch与$ all的结合使用。试试这个。
1)我通过以下方式在集合中创建了一个文档:
db.testColl.insert({count:0,arr:[{token:'xya'},{token:'xyb'},{token:'xyc'},{token:'xyd'},{token:'xye'}]})
2)然后我使用不带
的find命令db.testColl.find()
输出:
{ "_id" : ObjectId("52345478ef5f122b1c9c54be"), "count" : 0, "arr" : [ { "token" : "xya" }, { "token" : "xyb" }, { "token" : "xyc" }, { "token" : "xyd" }, { "token" : "xye" } ] }
3)然后我按顺序运行以下命令:
db.testColl.update({arr:{$elemMatch:{token:'xya'}}},{'$inc':{'count':1}})
db.testColl.update({arr:{$elemMatch:{token:'xyb'}}},{'$inc':{'count':1}})
db.testColl.update({arr:{$elemMatch:{token:'xyc'}}},{'$inc':{'count':1}})
db.testColl.update({arr:{$elemMatch:{token:'xyd'}}},{'$inc':{'count':1}})
db.testColl.update({arr:{$elemMatch:{token:'xye'}}},{'$inc':{'count':1}})
4)现在,db.testColl.find()为我提供了所需的正确输出:
{ "_id" : ObjectId("52345478ef5f122b1c9c54be"), "count" : 5, "arr" : [ { "token" : "xya" }, { "token" : "xyb" }, { "token" : "xyc" }, { "token" : "xyd" }, { "token" : "xye" } ] }
所以,你的查询似乎很好!!!