MongoDB Shell 用于更新子文档数组中特定字段的命令

MongoDB Shell Command for updating particular field(s) in Array of SubDocuments

对 Mongo 很陌生,不确定我是否对我想做的事情想得太多,但我正在努力更新文档。

这基本上是 schema/example 汽车文档:

{
    "_id": {
        "$oid": "60a67081e2692669d50f3de9"
    },
    "modelNumber": 0,
    "vin": "9876543210",
    "persons": [
        {
            "ids": [
                {
                    "value": "696969",
                    "type": "type1"
                },
                {
                    "value": "2850d92c-3849-4d81-a764-4deecd02cd81",
                    "type": "type2"
                }
            ],
            "isPrimaryOwner": true,
            "isInsured": false
        },
        {
            "ids": [
                {
                    "value": "696969",
                    "type": "type1"
                }
            ],
            "isPrimaryOwner": true,
            "isInsured": true
        },
        {
            "ids": [
                {
                    "value": "743743",
                    "type": "type1"
                }
            ],
            "isPrimaryOwner": true,
            "isInsured": false
        }
    ]
}

在本例中,我有一辆汽车和一组人物子文档。我正在尝试创建一个查询,在上面的示例中,如果我在他们的个人 ID 数组中看到多个具有相同 ID(在本例中为“696969”)的人,我想更新所有这些人的 'isPrimaryOwner' Person SubDocuments to 'false'(我知道这看起来像是数据质量问题,但请耐心等待)

我可以轻松地更新数组中的所有人或其中的一个人,但是我很难使用数组过滤器来仅更新我想要更新的 2 个(以上面为例)

Mongo Shell: db.Cars.updateMany({vin: "9876543210", "persons.ids.value": "696969", "persons.ids.type": "type1"}, {$set: {"persons.$[myIndex].isPrimaryOwner": false}}, {arrayFilters: [{"myIndex": [0]}]

对于 'myIndex' 变量,我现在有 0 来尝试看看它是否会更新数组中的第一个元素。它不是;在 shell 我得到了这样的回复:

{ acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 0,
  upsertedCount: 0 }

它似乎能够根据过滤条件识别我想要的文档,但它似乎无法找到我想要它更新的内容。

我觉得我缺少一些基本的东西。可能是因为我的 Persons 子文档没有 _id 字段,我可能需要它来更好地建立索引?

我希望一旦我弄清楚 Shell 命令有什么问题,我就能够将其转换为我需要使用 MongoDriver 在 C# 代码中执行的操作.

有人处理过类似的情况吗?也许是因为我在数组情况下得到了一个数组可能会导致我额外的复杂性?

我相信以下更新命令可以:

db.collection.updateOne(
    {
        vin: "9876543210"
    },
    {
        $set: { "persons.$[p].isPrimaryOwner": false }
    },
    {
        arrayFilters: [{
            "p.ids": { $elemMatch: { type: "type1", value: "696969" } }
        }]
    }
)

https://mongoplayground.net/p/89pBgZGtPRL