如何从嵌套在数组中的数组中更新项?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (172)

我正在通过最新的C#驱动程序使用MongoDB4.0(此时是V2.7.0)。我有一份文件其中有Options,而Options中有Inventory。换句话说,库存数组嵌套在一个选项数组中。如何降低到库存水平并只更新库存?

下面是SON格式的文件:

{
  "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"
        }
      ]
    }
  ]
}

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

提问于
用户回答回答于

在MongoDB4.0中,可以使用$[<identifier>]syntax(https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#update-all-documents-that-match-arrayfilters-in-an-array)并添加 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);

它将唯一识别Inventory项,且此项需要在Options内部更新。

扫码关注云+社区

领取腾讯云代金券