Как обновить массив в документе MongoDB с помощью MongoDB.Driver C#

#c# #arrays #mongodb #insert-update

Вопрос:

Пожалуйста, вы можете помочь мне с использованием драйвера MongoDB.в C#.

Как я должен использовать функцию updateOne с фильтрами и обновленными определениями для объединения элементов в моем массиве в моем документе.

Вот что у меня есть в моей коллекции MongoDB

 { 
    "_id" : ObjectId("6141890bab2c0e75cf5297c9"), 
    "MyUniqueId" : "123456", 
    "ModifiedFields" : [
        {
            "FieldId" : "Address1", 
            "Current" : "My street, 123"
        }, 
        {
            "FieldId" : "Address2", 
            "Current" : "My City"
        }, 
    ]
}
 

Я хочу объединить массив измененных полей с этой информацией

 { 
    "_id" : ObjectId("6141890bab2c0e75cf5297c9"), 
    "MyUniqueId" : "123456", 
    "ModifiedFields" : [
        {
            "FieldId" : "Address1", 
            "Previous" : "My street, 12"
        }, 
        {
            "FieldId" : "Address2", 
            "Previous" : "One city"
        }
    ]
}
 

Поэтому я должен получить это в качестве окончательного результата после обновления

 { 
    "_id" : ObjectId("6141890bab2c0e75cf5297c9"), 
    "MyUniqueId" : "123456", 
    "ModifiedFields" : [
        {
            "FieldId" : "Address1", 
            "Current" : "My street, 123",
            "Previous" : "My street, 12"
        }, 
        {
            "FieldId" : "Address2", 
            "Current" : "My City",
            "Previous" : "One city"
        }
    ]
}
 

Но это результат, который я получил

 { 
    "_id" : ObjectId("6141890bab2c0e75cf5297c9"), 
    "MyUniqueId" : "123456", 
    "ModifiedFields" : [
        {
            "FieldId" : "Address1", 
            "Current" : "My street, 123"
        }, 
        {
            "FieldId" : "Address2", 
            "Current" : "My City"
        }, 
        {
            "FieldId" : "Address1", 
            "Previous" : "My street, 12"
        }, 
        {
            "FieldId" : "Address2", 
            "Previous" : "One city"
        }
    ]
}
 

These are the class I’m using

 [BsonIgnoreExtraElements]
public class RecordsUpdate
{
    public string MyUniqueId;
    public List<CriterionsDataUpdate> ModifiedFields;   
}

public class CriterionsDataUpdate
{
    public string FieldId { get; set; }
    [BsonIgnoreIfNull]
    public string Previous { get; set; }
    [BsonIgnoreIfNull]
    public string Current { get; set; }
}
 

And this is how I’ve made the call for the update:

 RecordsUpdate recUpdate = new RecordsUpdate(“123456”);
FillPreviousValues(recUpdate); // this function will fill recUpdate.ModifiedFields with “Previous” values like shown above
var update = Builders<RecordsUpdate>.Update.AddToSetEach(r => r.ModifiedFields, recUpdate.ModifiedFields);
var updRes = AlertsTracing.RecordsUpdateCollection.UpdateOne(rec => rec.MyUniqueId == “123456”, update);
 

Thanks for your help

Eric