#c# #.net #mongodb #mongodb-.net-driver
Вопрос:
У меня есть несколько документов, как показано ниже, в коллекции 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"
}
]
}
]
}
При выполнении я хочу обновить значение «systemid» с «123» до «789» для всех документов, в которых «systemrecordname» = «source1», и для этого я написал ниже фрагмент кода, но данные не обновляются. Вы можете мне в этом помочь?
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
в $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
})
Комментарии:
1. это неправильный способ, так как элементы вложены, поэтому «orders.fulfillment.systemrecordname» не будет работать в коде C#.
2. Используйте
$elemmatch
вместо этого в C#, я просто рекомендую лучший способ в синтаксисе mongo.3. драйвер c# поддерживает предоставление необработанного MQL в UpdateDefinition с помощью неявного преобразования из строки или BsonDocument