数组中的Mongo数据库数组

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

我目前正在研究我们的持久化器以更新答案选项,我有以下代码:

public async Task Update(ItemList list, Guid id, Option option, CancellationToken cancellationToken = default)
{
    var filter = Builders<ItemList>.Filter.And(
        Builders<ItemList>.Filter.Eq("_id", list.Id),
        Builders<ItemList>.Filter.Eq("Items._id", id)
    );
    var update = Builders<ItemList>.Update.Set("Items.$[i].Options.$[j]", option);
    
    var arrayFilters = new List<ArrayFilterDefinition<ItemList>>
    {
        new BsonDocumentArrayFilterDefinition<ItemList>(
            new BsonDocument("i._id", elementId)
        ),
        new BsonDocumentArrayFilterDefinition<ItemList>(
            new BsonDocument("j._id", option.Id)
        )
    };      
    
    var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };
    
    await _collection.UpdateOneAsync(filter, update, updateOptions, cancellationToken);        
}

在数据库中,我们存储的 ids 是 guid 结构,如下所示:

{
  "_id": "ae39e133-18a6-43b0-8745-b13a00dd8632",
  “ItemId”: "af21eeb1-e952-4e10-af59-b13800cf8880",
  “Items”: [
    {
      "_t": “Item”,
      "_id": "e42f593e-1444-4f3a-9991-b15d008d9a99",
      "Options": [
        {
          "_id": "7dcccc2e-949a-4743-bd53-b15d008d9aa5",
          "Label": “test”,
          "Value": "a4e1c768-6cf9-417d-82bd-275c92be6a91",
          }
        }
      ]
    }
  ]
}

将查询放入 3t studio 中,它给了我 MongoInvalidArgumentError: 更新文档需要原子运算符,这是正在执行的记录查询,c# 驱动程序不会给出任何错误。

db.getCollection("Defintion").updateOne(
{ "update" : "Defintion", "ordered" : true, "$db" : "dbName", "lsid" : 
    { "id" : CSUUID("28fd5c50-4d0b-4a71-a2d4-d6c598b6f413") }, 
    "updates" : [{ "q" : { "_id" : "ae39e133-18a6-43b0-8745-b13a00dd8632", "Items._id" : "e42f593e-1444-4f3a-9991-b15d008d9a99" },
         "u" : { "$set" : { "Items.$[i].Options.$[j]" : 
             { "_id" : "7dcccc2e-949a-4743-bd53-b15d008d9aa5", "Label" : "Test2", "Value" : "a4e1c768-6cf9-417d-82bd-275c92be6a91"} } }, 
                 "arrayFilters" : [{ "i._id" : CSUUID("e42f593e-1444-4f3a-9991-b15d008d9a99") }, { "j._id" : CSUUID("7dcccc2e-949a-4743-bd53-b15d008d9aa5") }] }] }

)
.net mongodb
1个回答
0
投票

在 studio 3T 中,对于给定的示例,您可以使用以下更新命令:

db.getCollection("Defintion").updateOne(
    { "_id" : "ae39e133-18a6-43b0-8745-b13a00dd8632", "Items._id" : "e42f593e-1444-4f3a-9991-b15d008d9a99" },
     { "$set" : { "Items.$[i].Options.$[j]" : { "_id" : "7dcccc2e-949a-4743-bd53-b15d008d9aa5", "Label" : "Test2", "Value" : "a4e1c768-6cf9-417d-82bd-275c92be6a91"} }},
    {  "arrayFilters" : [{ "i._id" : "e42f593e-1444-4f3a-9991-b15d008d9a99" }, { "j._id" : "7dcccc2e-949a-4743-bd53-b15d008d9aa5" }]}
    
    )

更新语法如下来自文档

db.collection.updateOne(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>,
     let: <document>
   }
)
© www.soinside.com 2019 - 2024. All rights reserved.