以下是我的假设用户集合,其中允许多个地址:
{
"firstName": "Joe",
"lastName": "Grey",
...
"addresses":
[
{
"name": "Default",
"street": "...",
...,
"isDefault": true
},
{
"name": "Home",
"street": "...",
...,
"isDefault": false
},
{
"name": "Office",
"street": "...",
...,
"isDefault": false
}
]
}
这次我添加了isDefault
标志,该标志应该是互斥的。也就是说,当我更新地址并将isDefault
设置为true
时,我应该确保数组的其他元素中的此标志设置为false
。有没有办法在不执行查找和更新的情况下一步完成?
答案 0 :(得分:1)
目前您通常会发现这是不可能的,因为无法一次更新数组中的多个字段,更不用说使用不同的值了。甚至考虑以下操作:
db.collection.update(
{ "addresses.isDefault": false },
{ "addresses.isDefault.$": true }
)
现在这是你想要做的事情的反向(很好的一部分),但为了说明我的观点,那将匹配数组中的第一个项目符合查询条件。在更新中使用positional $
运算符,实际上只会设置数组中的 second 项。 第三个元素将保持不变,因为此操作不起作用。文档涵盖了这一点。
为了一次设置所有字段,您必须通过find检索整个文档,在代码中翻转您的值,然后在替换整个数组时单独更新。
现在评论中的“链接”说,你可以一举完成这一切。但即便如此,您将构建查询并更新数组中的每个元素。但它会更有效率。