在 C# 中批量更新 mongoDB 文档
Posted
技术标签:
【中文标题】在 C# 中批量更新 mongoDB 文档【英文标题】:Update mongoDB document in bulk in C# 【发布时间】:2021-12-13 08:37:40 【问题描述】:我在 mongo 集合中有多个如下文档(仅提供一个示例)。
"_id": "5fdb",
"createddate": "2020-12-17",
"orders": [
"_id": "4c65",
"sourcesystemrecordid": null,
"accepteddate": "2020-12-19",
"fulfillment": [
"_id": "7d3ceb",
"createdby": "Azekry",
"systemid": "123",
"systemrecordname": "source1"
]
]
在履行过程中,我想将“systemrecordname”=“source1”的所有文档的“systemid”值从“123”更新为“789”,为此我在下面写了代码,但数据未更新。你能帮我解决这个问题吗?
foreach (var item in resultFromDatabse)
var ordr = item.orders;
foreach (var e in ordr)
var actualval = "789";
foreach (var ef in e.fulfillment.Where(x => x.systemrecordname == "source1"))
filter = builder.Eq("systemrecordname", ef.systemrecordname);
var update = Builders<EquipmentDemandPlan>.Update.Set("orders.$[e].fulfillment.$[ef].systemid", actualval);
UpdateOneModel<EquipmentDemandPlan> updateOne = new UpdateOneModel<EquipmentDemandPlan>(filter, update)
ArrayFilters = new List<ArrayFilterDefinition>
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("ef.systemrecordname", ef.systemrecordname))
;
bulkupdate.Add(updateOne);
collection.BulkWriteAsync(bulkupdate);
【问题讨论】:
【参考方案1】:你只需要arrayFilters
in $set
db.collection.update(
"orders.fulfillment.systemrecordname": "source1"
,
$set:
"orders.$[o].fulfillment.$[f].systemid": "789"
,
arrayFilters: [
"o._id":
$exists: true
,
"f.systemrecordname": "source1"
],
multi: true
)
mongoplayground
【讨论】:
这不是正确的方法,因为元素是嵌套的,所以“orders.fulfillment.systemrecordname”在 C# 代码中不起作用。 在C#中使用$elemmatch
,我只是推荐一种更好的mongo语法方式。
c# 驱动程序支持通过从字符串或 BsonDocument 的隐式转换将原始 MQL 提供到 UpdateDefinition以上是关于在 C# 中批量更新 mongoDB 文档的主要内容,如果未能解决你的问题,请参考以下文章