2013-01-09 114 views
3

可能重复:
Can mongo upsert data?的Upsert子文档使用猫鼬

我已经架构定义如下:

var Permission = new Schema({ 
    _id: String, // email address 
    role: String // "admin" or "member" 
}); 

var Org = new Schema({ 
    name: {type: String, index: {unique: true, dropDups: true}, trim: true}, 
    permissions: [Permission] 
}); 

我想无论是匹配和更新子文档行(在我的例子中,'权限'),或者如果不匹配,插入一个新的许可行(例如,upsert)。

这是我采写:

exports.updatePermissions = function(req, res) { 
    return Org 
    .update(
     {name:"my_org", "permissions.$._id": req.body.email}, 
     {$set: {"permissions.$.role": req.body.role}}) 
    .exec(function(err) { 
     // stuff 
    }); 
}; 

的MongoDB似乎接受了这一点(例如没有错误),但是数据库没有变化。我在mongo shell中也尝试了以下内容:

db.orgs.update({"name":"my_org", "permissions.$._id":"[email protected]"}, {$set: {"permissions.$.role": "member"}}); 

同样,Mongo接受查询,但没有更改。下面是我想修改文档:

{ 
    "name" : "my_org", 
    "permissions" : [ 
     { 
      "_id" : "[email protected]", 
      "role" : "admin" 
     } 
    ] 
} 

有什么建议?非常感谢

回答

0

这对我的作品与$elemMatch,还检查出rules for the $ operator

db.orgs.update({"name":"my_org", "permissions": {$elemMatch: {_id:"[email protected]"}}}, 
    {$set: {"permissions.$.role": "member"}}); 
+1

感谢。这适用于我更新现有条目,但它不插入不存在的条目(我也添加了upsert = true)。你有关于upsert在这里工作的建议吗? –

+0

我认为你在upsert上运气不佳。 “$”操作员文档特别警告不要将其用于“upsert”操作。 – mjhm