我有一个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。但这也没有帮助。
感谢您的帮助。
答案 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 看看吧。