找不到标识符“-1”的数组过滤器

No array filter found for identifier '-1'

我正在使用 C# 驱动程序 2.14 MongoDB 开发 .NET 应用程序。 我的查询如下:

我有一个嵌入式数组元素,例如:

{
    "_id" : 1,
        "Friends" : [
                {
                        "_id" : 2,
                        "FirstName" : "Bob",
                        "LastName":"Marley",
                        "Gender":"Male",
                        ...
                },
                {
                        "_id" : 3,
                        "Name" : "Jonson",
                        "LastName":"Charles",
                        "Gender":"Male",
                        ...
                },
                {
                        "_id" : 4,
                        "Name" : "Bob",
                        "LastName":"",
                        "Gender":"Male",
                        ...
                }
        ]
}

其中有多个字段。我需要更新其中一个嵌套文档中的所有值。

我写了一个代码如下:

var filter1 = Builders<BsonDocument>.Filter.Eq("_id", 1);
var filter2 = Builders<BsonDocument>.Filter.ElemMatch<BsonValue>("Friends", new BsonDocument(){ {"_id", 2 }});

var update = Builders<BsonDocument>.Update.Set("Friends.$[-1]", BsonDocument.Parse(JsonConvert.SerializeObject(object)));

await collection.UpdateAsync(filter1&filter2, update);

我得到的异常是:

No array filter found for identifier '-1'

任何人都可以建议这是否是正确的方法吗?

对于

,MongoDB中的syntax/statement无效
"Friends.$[-1]"

您需要 arrayFilter 来更新嵌套数组字段中的文档。

using MongoDB.Bson;

var filter1 = Builders<BsonDocument>.Filter.Eq("_id", 1);
var filter2 = Builders<BsonDocument>.Filter.ElemMatch<BsonValue>("Friends"
    , new BsonDocument() { { "_id", 2 } });

// Sample value to be updated
var obj = new
{
    _id = 2,
    FirstName = "Bobby",
    LastName = "Marley",
    Gender = "Female"
};

var arrayFilters = new[]
{
    new BsonDocumentArrayFilterDefinition<BsonDocument>(
        new BsonDocument("friend._id", 2)
        )
};

var update = Builders<BsonDocument>.Update.Set("Friends.$[friend]", obj.ToBsonDocument());

await collection.UpdateOneAsync(filter1 & filter2, update,
    options: new UpdateOptions { ArrayFilters = arrayFilters });

注:

此语句用于将object转换为BsonDocument

BsonDocument.Parse(JsonConvert.SerializeObject(object))

可以替换为

obj.ToBsonDocument()

Output