Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDB Shell命令,用于更新子文档数组中的特定字段_C#_Arrays_Mongodb_Mongodb Query_Asp.net Core 3.1 - Fatal编程技术网

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

C# MongoDB Shell命令,用于更新子文档数组中的特定字段,c#,arrays,mongodb,mongodb-query,asp.net-core-3.1,C#,Arrays,Mongodb,Mongodb Query,Asp.net Core 3.1,对Mongo来说是个新手,我不确定我是否想得太多了,但我正在努力更新文档 这基本上就是car文档的模式/示例: { "_id": { "$oid": "60a67081e2692669d50f3de9" }, "modelNumber": 0, "vin": "9876543210", "persons"

对Mongo来说是个新手,我不确定我是否想得太多了,但我正在努力更新文档

这基本上就是car文档的模式/示例:

{
    "_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
        }
    ]
}
在本例中,我有一辆汽车和一组Person子文档。我正在尝试创建一个查询,在上面的示例中,如果我在其个人id数组中看到多个具有相同id(在本例中为“696969”)的人员,我希望将所有这些人员子文档的“isPrimaryOwner”更新为“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" } }
        }]
    }
)

ooooooh MongoPlayground这太棒了!非常感谢。我不确定这一部分对ArrayFilter有多严格,现在读了它就有意义了。我会试试看会发生什么!嗯……似乎当我更新查询并使用更复杂的模型时,即使在操场上,它也不会因为任何原因而起作用。这是超级的trange您的
id
对象的字段是否比type和value多?如果是,则需要修改数组筛选器。不幸的是,没有。id对象中没有其他字段。
persons
对象中有更多字段,但这不重要,因为车中有更多字段。persons示例。@Schanckopotamus elemMatch单独匹配字段,而eq尝试匹配精确的对象。