Mongodb,更新Array中的每个字段

时间:2013-08-22 14:05:55

标签: mongodb

拥有user_id =“2”,如何设置所有这些hasSeen:false, 除了用hasSeen设置的user_id =“2”:true?

{
    cc: [
          { user_id: "1", hasSeen:true}
         ,{ user_id: "2", hasSeen:false}
         ,{ user_id: "3", hasSeen:false}

    ]
}

我试过

   .update({ $set:{ 'cc.$.hasSeen':false } })

但它不起作用......

1 个答案:

答案 0 :(得分:1)

这在单次操作中是不可能的。您可以更新每个子文档值。使用更新中的getLastError,您可以确定需要更新的次数,例如:

1)将所有hasSeen值设置为false

db.test.update( { "cc.hasSeen": true}, 
                { $set: { "cc.$.hasSeen" : false }})
while (db.getLastErrorObj()['n'] > 0) {
    db.test.update( { "cc.hasSeen": true}, 
                    { $set: { "cc.$.hasSeen" : false }})
}

2)设置user_id=2已将值设为2:

db.test.update( { "cc.user_id": "2"}, 
                { $set: { "cc.$.hasSeen" : true }})

但是,这会引入竞争条件,因为您有n个操作而不是单个原子操作。