如何更新数组中嵌套的数组中的项目

Tar*_*yen 3 c# mongodb

我通过最新的 C# 驱动程序(此时为 v2.7.0)使用 MongoDB 4.0。我有一份文件,其中有Options和。换句话说,库存数组嵌套在选项数组中。如何了解库存水平并仅更新库存?OptionsInventory

以下是我的 JSON 格式文档的样子:

{
  "Options": [
    {
      "Id": 1,
      "Description": "This is one option",
      "Inventory": [
        {
          "Id": 1,
          "Name": "Box of stuff"
        },
        {
          "Id": 2,
          "Name": "Another box of stuff"
        }
      ]
    },
    {
      "Id": 2,
      "Description": "This a second option",
      "Inventory": [
        {
          "Id": 1,
          "Name": "Box of stuff"
        },
        {
          "Id": 2,
          "Name": "Another box of stuff"
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

使用 C# 驱动程序,如果我知道选项的 Id 和库存项目的 Id,如何更改单个选项中单个库存项目的名称?

mic*_*ckl 6

在 MongoDB 4.0 中,您可以使用$[<identifier>] 语法并添加ArrayFiltersUpdateOptions参数:

var filter = Builders<Model>.Filter.Empty;
var update = Builders<Model>.Update.Set("Options.$[option].Inventory.$[inventory].Name", "New name");

var arrayFilters = new List<ArrayFilterDefinition>();
ArrayFilterDefinition<BsonDocument> optionsFilter = new BsonDocument("option.Id", new BsonDocument("$eq", optionId));
ArrayFilterDefinition<BsonDocument> inventoryFilter = new BsonDocument("inventory.Id", new BsonDocument("$eq", inventoryId));
arrayFilters.Add(optionsFilter);
arrayFilters.Add(inventoryFilter);

var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };

var result = DefaultCollection.UpdateOne(filter, update, updateOptions);
Run Code Online (Sandbox Code Playgroud)

这将唯一标识Inventory内部需要更新的项目Options