Массовое обновление документа MongoDB в C#

#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
})
 

mongoplayground

Комментарии:

1. это неправильный способ, так как элементы вложены, поэтому «orders.fulfillment.systemrecordname» не будет работать в коде C#.

2. Используйте $elemmatch вместо этого в C#, я просто рекомендую лучший способ в синтаксисе mongo.

3. драйвер c# поддерживает предоставление необработанного MQL в UpdateDefinition с помощью неявного преобразования из строки или BsonDocument