gpt4 book ai didi

c# - 尝试更新 MongoDb 数组元素时出错

转载 作者:可可西里 更新时间:2023-11-01 09:14:45 24 4
gpt4 key购买 nike

在我的 Azure CosmosDb MongoApi 中,我有带有嵌入文档数组的 JSON。

{
"_id": ObjectId("5a95745df886842904b82f71"),
"token": "value1",
"channel": "value2",
"urls":
[
{
"url": "<url1>",
"interval": "<int>"
},
{
"url": "<url2>"
"interval": "<int>"
}
]
}

我想更新特定数组元素中的“间隔”字段。问题是当我使用像 this 这样的解决方案时或 this ,我最终有一个异常(exception):

MongoDB.Driver.MongoCommandException: Command findAndModify failed: Invalid BSON field name 'urls.$.interval'.

因此,我决定尝试在 Mongo Shell 中运行查询并得到相同的错误:

{
"nMatched": 0,
"nUpserted": 0,
"nModified": 0,
"writeError":
{
"code": 2,
"errmsg": "Invalid BSON field name 'urls.$.interval'"
}
}

这是我的 C# 代码:

    var filterBuilder = Builders<User>.Filter;
var filter = filterBuilder.Where(p => p.Token == model.Token && p.Channel == model.Channel && p.Urls.Any( u => u.Url == model.Url));
var update = Builders<User>.Update.Set(p => p.Urls.ElementAt(-1).interval, 5);
await _context.Users.FindOneAndUpdateAsync<User>(filter, update);

这是我的 MongoDb shell 请求:

db.Users.update( {"urls.interval": 60}, {$set: {"urls.$.interval": 30}} ); 

我的问题是导致此异常的原因是什么,我该如何避免?

最佳答案

Cosmos DB 当前不支持位置运算符。请使用以下解决方法:在客户端迭代文档和数组元素,更改所需元素并使用新数组对文档进行更新: 例如,假设您有一个包含以下元素的用户集合:

{ 
    "_id" : ObjectId("59d6b719708b990d6c9b3aca"),
    "tags" : [
        {
            "id" : 1,
            "value" : "11"
        },
        {
            "id" : 2,
            "value" : "22"
        },
        {
            "id" : 3,
            "value" : "32"
        }
    ]
}
 

…您可以发出以下命令来更新其中一个元素(在本例中为 id=1):

db.users.find().forEach( 
        function(user)
        {
         user.tags.forEach(
         function(tag)
         {
               if (tag.id=="1")
               {
                       tag.value = "Updated!";                         
                       db.users.updateOne({_id : user._id}, {$set: {"tags": user.tags}});
               }
        }
        );
       } 
);

您可以调整 if() 中的条件,其粒度比位置运算符所允许的粒度更细。

关于c# - 尝试更新 MongoDb 数组元素时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49013105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com