C# MongoDB Shell命令,用于更新子文档数组中的特定字段
对Mongo来说是个新手,我不确定我是否想得太多了,但我正在努力更新文档 这基本上就是car文档的模式/示例: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"
{
"_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尝试匹配精确的对象。