Mongo C#驱动程序更新嵌套数组中的特定元素

5
如何在Mongo(C#驱动程序)中修改嵌套属性(数组)中的单个元素,而无需检索整个文档?
public class Element
{
    public int Value {get; set;}

    public string Name {get; set;}
}

public class Document
{

     public Element [] Elements {get; set;}
}

在这个例子中,我想要在一个查询中找到名为“Car”的元素并将其值设置为4。
1个回答

9

您需要使用$位置操作符,其中可以指定文档级条件和数组级条件,以在特定文档的数组中查找单个嵌套项。在C#中,$符号由作为模型数组索引传递的-1表示。请尝试:

var col = mydb.GetCollection<Document>("collectionName");
var id = new ObjectId("5babaaf5509f6d342da5abaa");
var elementName = "Car";
var newValue = 2;

var filterBuilder = Builders<Document>.Filter;
var filter = filterBuilder.Eq(x => x.Id, id) &
    filterBuilder.ElemMatch(doc => doc.Elements, el => el.Name == elementName);

var updateBuilder = Builders<Document>.Update;
var update = updateBuilder.Set(doc => doc.Elements[-1].Value, newValue);

Col.UpdateOne(filter, update);

更新:在 .NET 6 的 MongoDB.Driver 2.19 中不支持 -1,您将收到这样的消息:Expression not supported: x.Elements.get_Item(-1) because negative indexes are not valid. To use the positional operator $ use FirstMatchingElement instead of an index value of -1. 只需包含 using MongoDB.Driver.Linq 语句并替换上面的行即可。

using MongoDB.Driver.Linq;

var update = updateBuilder.Set(doc => doc.Elements.FirstMatchingElement().Value, newValue);

3
我需要更新与筛选条件相匹配的所有元素。这只会更新一个元素吗? - Hammad Sajid
4
@HammadSajid 是的,这将仅更新一个,如果要更新多个,您可以尝试:https://dev59.com/Lbnoa4cB1Zd3GeqPM0C4#60220666 - mickl
1
非常感谢您,我已经搜索了几个小时,但还是找不到它。 - Hammad Sajid
在C#中,$符号由将-1作为模型数组的索引传递来表示。从这里学到了,谢谢! - Peet vd Westhuizen
非常感谢上面的更新,在经过数小时在网络上搜索后解决了我的问题。官方文档真的需要一些关注。FirstMatchingElement 正是我所需,而且也很简洁易懂。 - Dorian Farrimond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接