拥有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 } })
但它不起作用......
答案 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
个操作而不是单个原子操作。