2

我有一个带有嵌入式文档数组的模型。

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-中的教程进行操作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);
    }      
})

但它不起作用,如果我删除 'invitations':{'$elemMatch':{'token':token}},查询将起作用

4

1 回答 1

1

根据文档$elemMatch 只能用于投影。但是我找到了一个例子来说明 $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" } ] }

所以,你的查询似乎很好!

于 2013-09-14T08:17:43.847 回答