考虑这个数据
{
"_id" : ...,
"array" : [
{ "name" : "value1","flag" : true } ,
{ "name" : "value2","flag" : false }
]
}
我想切换第二个数组元素(从false到true)
我知道我可以使用非常有用的$ position运算符更新特定元素,如下所示:
db.myCollection.update(
{'array.name':'value2'},
{
$set: {
'array.$.flag':true
}
},false,true);
但有没有办法使用$ positional运算符进行值设置?
e.g。像这样?
db.myCollection.update(
{'array.name':'value2'},
{
$set: {
'array.$.flag':'!array.$.flag' //<--
}
},false,true);
答案 0 :(得分:6)
不,目前不可能。 MongoDB不允许更新中的表达式依赖于文档中的字段。你必须在两个单独的操作中进行设置。
然而,有一个技巧可以在一个操作中进行(因此是原子操作)。而不是布尔值,有一个整数。那么偶数值将代表false
,奇数代表true
。
// get documents with false flag
db.collection.find({flag: {$mod: [2, 0]}})
// get documents with true flag
db.collection.find({flag: {$mod: [2, 1]}})
// toggle flag
db.collection.update(query, {$inc: {flag: 1}});