1

拥有 user_id="2",我如何设置所有这些 hasSeen:false,除了 user_id="2" 设置为 hasSeen:true ?

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

    ]
}

我试过了

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

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

4

1 回答 1

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) Setuser_id=2已经看到了两个值:

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

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

于 2013-08-22T14:42:55.627 回答