C# - MongoDB - 更新嵌套文档中的元素

时间:2018-01-10 04:12:21

标签: c# mongodb

我有一个MongoDB文件如下

{
"_id" : ObjectId("5a55775cbd12982cc063c71a"),
"ShipmentNumber" : "00004000000048652254",
"Cartons" : [ 
    {
        "_id" : ObjectId("5a5575bcbd12982cc063b718"),
        "CartonNumber" : "0076013926580S",
        "Skus" : [ 
            {
                "_id" : ObjectId("5a5575bcbd12982cc063b719"),
                "SkuNumber" : "06577647",
                "ShippedQuantity" : 12,
            },
            {
                "_id" : ObjectId("5a5575bcbd12982cc063b519"),
                "SkuNumber" : "06577657",
                "ShippedQuantity" : 15,
            }
        ],
        "IsScanned" : false,
    },
}

如何根据C#代码中的“_id”更新特定Sku元素的“ShippedQuantity”?

我尝试过类似下面的内容。但它没有用。 获取

之类的错误消息
  

不能使用零件(Cartons of Cartons。$ []。Skus。$。ShippedQuantity)来   遍历元素

var filter = Builders<BsonDocument>.Filter.Eq("Cartons.Skus._id", new ObjectId("5a5575bcbd12982cc063b519"));
var update = Builders<BsonDocument>.Update.Set("Cartons.$[].Skus.$.ShippedQuantity", 50)

当我尝试更新多级文档时,我遇到了困难。 (在这种情况下,我有一个纸箱列表,每个纸箱都有自己的skus列表,我需要更新特定的sku元素)

请使用C#提供一个解决方案或替代方法来更新MongoDB中的这个内部级别(超过2个级别)文档。

我将MongoDB服务器更新到最新的3.6.1。但这也没有帮助。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

首先,您需要在MongoDB中运行此命令以应用版本3.6.1的新功能db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } )

以下是该更新所需的代码:

var filter = Builders<YOUR_CLASS>.Filter.Eq("_id", new ObjectId("5a55775cbd12982cc063c71a"));
var update = Builders<YOUR_CLASS>.Update.Set("Cartons.$[i].Skus.$[j].ShippedQuantity", 50);

var arrayFilters = new List<ArrayFilterDefinition>
{
    new BsonDocumentArrayFilterDefinition<Setup>(new BsonDocument("i._id", new ObjectId("5a5575bcbd12982cc063b718"))),
    new BsonDocumentArrayFilterDefinition<Setup>(new BsonDocument("j._ID", new ObjectId("5a5575bcbd12982cc063b719")))
};
var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };
var (updated, errorMessage) = await UpdateOneAsync(filter, update, updateOptions);

此外,您可以在MongoDB中运行设置这些设置以查看最终查询并在RoboMongo或Studio 3T中手动运行它们以进行调试:

db.setProfilingLevel(2)   -> to view query logs under C:\data\log\mongod.log
db.setLogLevel(5)         -> to view query logs under C:\data\log\mongod.log

在日志文件中查找“UPDATE”查询。之后,您可以将日志设置重置为0

db.setProfilingLevel(0)
db.setLogLevel(0)

我遇到了同样的问题并问了同样的问题Here 看看吧。