MongoDB:如何使用数组的字段作为互斥标志

时间:2014-03-06 06:02:48

标签: mongodb

以下是我的假设用户集合,其中允许多个地址:

{
  "firstName": "Joe",
  "lastName": "Grey",
  ...
  "addresses":
  [
    {
      "name": "Default",
      "street": "...",
      ...,
      "isDefault": true
    },
    {
      "name": "Home",
      "street": "...",
      ...,
      "isDefault": false
    },
    {
      "name": "Office",
      "street": "...",
      ...,
      "isDefault": false
    }
  ]
}

这次我添加了isDefault标志,该标志应该是互斥的。也就是说,当我更新地址并将isDefault设置为true时,我应该确保数组的其他元素中的此标志设置为false。有没有办法在不执行查找和更新的情况下一步完成?

1 个答案:

答案 0 :(得分:1)

目前您通常会发现这是不可能的,因为无法一次更新数组中的多个字段,更不用说使用不同的值了。甚至考虑以下操作:

db.collection.update(
   { "addresses.isDefault": false },
   { "addresses.isDefault.$": true }
)

现在这是你想要做的事情的反向(很好的一部分),但为了说明我的观点,那将匹配数组中的第一个项目符合查询条件。在更新中使用positional $运算符,实际上只会设置数组中的 second 项。 第三个​​元素将保持不变,因为此操作不起作用。文档涵盖了这一点。

为了一次设置所有字段,您必须通过find检索整个文档,在代码中翻转您的值,然后在替换整个数组时单独更新。

现在评论中的“链接”说,你可以一举完成这一切。但即便如此,您将构建查询并更新数组中的每个元素。但它会更有效率。