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

问题描述 投票:0回答:1

如何在 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。

c# mongodb mongodb-.net-driver
1个回答
8
投票

您需要 $ 位置运算符,您可以在其中指定文档级条件和数组级条件以在特定文档的数组中查找单个嵌套项。在 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);

更新: -1 is not supported in MongoDB.Driver 2.19 in .NET 6,你会得到

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);
© www.soinside.com 2019 - 2024. All rights reserved.