假设我有以下文档 struct .

[
  {
    "_id": 1,
    "depots": [
      {
        "_id": 1,
        "isFavourite": true
      },
      {
        "_id": 2,
        "isFavourite": false
      },
      {
        "_id": 3,
        "isFavourite": true
      },
      {
        "_id": 4,
        "isFavourite": false
      }
    ]
  }
]

我想写一个single update query,它用_id: 1过滤文档,首先将每个isFavourite值设置为false,然后将第二个isFavourite值(或任何指定的索引)设置为true.

生成的文档应该是这样的.

[
  {
    "_id": 1,
    "depots": [
      {
        "_id": 1,
        "isFavourite": false
      },
      {
        "_id": 2,
        "isFavourite": true
      },
      {
        "_id": 3,
        "isFavourite": false
      },
      {
        "_id": 4,
        "isFavourite": false
      }
    ]
  }
]

我try 的内容:

db.collection.update({
  _id: 1
},
[
  {
    "$set": {
      "depots.isFavourite": false
    }
  },
  {
    "$set": {
      "depots.2.isFavourite": true
    }
  }
])

然而奇怪的是,这不起作用.有关此查询的结果,请参见链接的操场.

Mongo Playground

推荐答案

仅当更新不是管道时,才使用索引作为点表示法.

一种 Select 是使用$reduce"重建"数组,这允许我们使用当前构建的数组的大小来查找具有请求索引的项,然后使用更新的字段和值对其进行$mergeObjects:

db.collection.update(
{_id: 1},
[
  {$set: {"depots.isFavourite": false}},
  {$set: {
      depots: {
        $reduce: {
          input: "$depots",
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              [
                {$cond: [
                    {$eq: [{$size: "$$value"}, requestedIndex]},
                    {$mergeObjects: ["$$this", {isFavourite: true}]},
                    "$$this"
                  ]
                }
              ]
            ]
          }
        }
      }
    }
  }
])

看看它在playground example上是如何工作的

Mongodb相关问答推荐

从MongoDB迁移到PostgreSQL:为PostgreSQL编写聚合管道查询

Spring Boot 升级后未映射 Mongo 模板结果

MongoDB 支持的最 Big Data 库数

无法让 Mongoose.js 子文档数组填充

增加嵌套对象中的值?

加载时将 mongo 存储的日期转换回自 Unix 纪元以来的毫秒数?

删除嵌套文档数组中的嵌入文档

使用 ObjectId.GenerateNewId() 还是离开 MongoDB 创建一个?

MongoDB 3 Java判断集合是否存在

Mongoose 是否真的验证了对象 ID 的存在?

使用 MongoDB 进行嵌套分组

如何在mongodb中删除数组的第n个元素

文本的 MongoID 数据类型

在MongoDB中查询一个半​​径内的位置

一起使用 MongoDB 和 Neo4j

查询不等于 null 或空的地方

PyMongo 中的警告消息:count is deprecated

使用 mongoengine 将多文档插入到 mongodb

show dbs 给出Not Authorized to execute command错误

MongoDB聚合框架的索引优化