使用MongoDB,如何使用C#驱动程序更新文档中的单个数组元素。
允许我进行设置。假设有一个集合,称为“事物”。在Things集合中,有许多文档。这是两个“物”文档:
{
"_id":"2d7fcf21-34b8-4537-b07f-01659d87eda4",
"Name":"Something",
"Stuff":[
{
"Id":"1fdd098c-5e60-4dd8-a6a6-96b26cd90dc9",
"Completed":false
},
{
"Id":"b63cc911-a577-4744-bb0f-b9d9deabcf66",
"Completed":false
}
]
}
{
"_id":"d4ba4420-238f-4e11-9ad8-721dc3eb0ad7
",
"Name":"Another Thing",
"Stuff":[
{
"Id":"f2d46144-15eb-4451-851a-cba80dd8949b",
"Completed":false
},
{
"Id":"f2d46144-15eb-4451-851a-cba80dd8949b",
"Completed":false
}
]
}
如果我有文档的_id以及要更改的数组中项目的ID,如何在不替换整个文档或数组的情况下将“已完成”属性从false切换为true? >
我在这里显示的数据不是我正在处理的应用程序的实际数据,它是为本示例设计的。另外,我正在使用C#MongoDB驱动程序v2.7.2,并且我的数据库正在Atlas的MongoDB v4上运行。
答案 0 :(得分:2)
要更新嵌套数组中的单个项目,您需要使用$ positional operator,它需要附加过滤器来表示对嵌套数组的过滤。可以使用C#中的ElemMatch
表示该过滤器。然后,要引用匹配的子文档,可以将-1
传递给嵌套数组的索引器。试试:
var documentId = "2d7fcf21-34b8-4537-b07f-01659d87eda4";
var stuffId = "1fdd098c-5e60-4dd8-a6a6-96b26cd90dc9";
var filter = Builders<YourModel>.Filter.And(Builders<YourModel>.Filter.Eq(x => x._id, documentId),
Builders<YourModel>.Filter.ElemMatch(x => x.Stuff, f => f.Id == stuffId));
var update = Builders<YourModel>.Update.Set(model => model.Stuff[-1].Completed, true);
Col.UpdateOne(filter, update);