mongodb - C# mongodb - 如何更新嵌套数组元素

标签 mongodb mongodb-.net-driver

我有以下表示项目的 JSON 结构

{
    Id: "a",
    Array1: [{
        Id: "b",
        Array2: [{
            Id: "c",
            Array3: [
                {...}
            ]
        }]
    }]
}

我需要能够替换 Array2 中的数组元素使用新项目或仅替换 Array3用一个新数组。

这是我替换 Array2 中的数组项的代码:
await Collection.UpdateOneAsync(
    item => item.Id.Equals("a") &&
    item.Array1.Any(a => a.Id.Equals("b")) &&
    item.Array1[-1].Array2.Any(b => b.Id.Equals("c")),
    Builders<Item>.Update.Set(s => s.Array1[-1].Array2[-1], newArray2Item)
);

执行此代码时,我收到此错误:
"A write operation resulted in an error.
 Too many positional (i.e. '$') elements found in path 'Array1.$.Array2.$'"

这是我要替换的代码 Array3Array2 :
await Collection.UpdateOneAsync(
        item => item.Id.Equals("a") &&
        item.Array1.Any(a => a.Id.Equals("b")) &&
        item.Array1[-1].Array2.Any(b => b.Id.Equals("c")),
        Builders<Item>.Update.Set(s => s.Array1[-1].Array2[-1].Array3, newArray3)
    );

这是错误:
"A write operation resulted in an error.
 Too many positional (i.e. '$') elements found in path 'Array1.$.Array2.$.Array3'"

我使用的是 C# MongoDB 驱动程序版本 2.5.0 和 MongoDB 版本 3.6.1

我找到了这张 Jira 票 Positional Operator Matching Nested Arrays表示问题已解决,他们建议使用此语法进行更新
Update all matching documents in nested array:

db.coll.update({}, {$set: {“a.$[i].c.$[j].d”: 2}}, {arrayFilters: [{“i.b”: 0}, {“j.d”: 0}]})
Input: {a: [{b: 0, c: [{d: 0}, {d: 1}]}, {b: 1, c: [{d: 0}, {d: 1}]}]}
Output: {a: [{b: 0, c: [{d: 2}, {d: 1}]}, {b: 1, c: [{d: 0}, {d: 1}]}]}

所以我将它转换为我的元素:
db.getCollection('Items').update(
{"Id": "a"},
{$set: {"Array1.$[i].Array2.$[j].Array3": [newArray3]}}, 
{arrayFilters: 
    [
        {"i.Id": "b"}, 
        {"j.Id": "c"}
    ]}
)

并得到这个错误:
cannot use the part (Array1 of Array.$[i].Array2.$[j].Array3) to traverse the element

有关如何解决此错误的任何想法?

最佳答案

这是您需要的 C# 版本:

var filter = Builders<Item>.Filter.Eq("Id", "a");
var update = Builders<Item>.Update.Set("Array1.$[i].Array2.$[j].Array3", new[] { new Item { Id = "d" } });
var arrayFilters = new List<ArrayFilterDefinition> { new JsonArrayFilterDefinition<Item>("{'i.Id': 'b'}"), new JsonArrayFilterDefinition<Item>("{'j.Id': 'c'}") };
var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };
collection.UpdateOne(filter, update, updateOptions);

关于mongodb - C# mongodb - 如何更新嵌套数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48868243/

相关文章:

java - Mapstruct 生成的类使用父级而不是子级的 Lombok 构建器

java - 如何使用java在这个mongodb查询中使用 HashMap 编写

c# - Mongodb 驱动程序 Linq 查询抛出异常

c# - 在 LINQ lambda 表达式中使用字符串变量

c# - 在 mongodb 中,获取第一个和最后一个文档的最有效方法是什么

mongodb - 如何在 Yii2 中保存 Mongodb 嵌入式数组

java - 为什么 Casbah/Java MongoDB 驱动程序会出现 java.lang.IllegalArgumentException?

node.js - mongodb使用json更新同一行的多个字段

linq - 具有可空类型的 MongoDB C# Linq 驱动程序

带有查询 C# 驱动程序的 MongoDb Distinct