Заменить встроенный документ с помощью драйвера Mongo C # 2.0

#c# #mongodb #nosql

#c# #mongodb #nosql

Вопрос:

У меня есть документ, в котором есть встроенный массив блоков, например, этот:

 {
    "_id" : ObjectId("5807c22e959ca231f0c48a75"),
    "Code" : "Value",
    "Units" : [ 
        {
            "_id" : ObjectId("5807cc08959ca331f09c530e"),
            "Code" : "Foo",
            "Label" : "Foo"
        },
        {
            "_id" : ObjectId("5807cc08959ca331f09c530e"),
            "Code" : "Bar",
            "Label" : "Bar"
        },
    ]
}
  

Я хочу найти единицу по ее идентификатору и заменить ее новым документом.
Как я мог бы это сделать, используя драйвер Mongo C # 2.0?

Заранее спасибо!

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

1. что вы уже сделали?

2. Если бы мой ответ помог вам, возможно, вы могли бы принять его как ответ с отметкой и проголосовать, если считаете, что это может быть полезно другим. Я говорю это только потому, что заметил, что вы здесь новичок

Ответ №1:

Спасибо, ребята. Из ваших ответов я пришел к следующему решению:

 var mainDocumentId = "5807c22e959ca231f0c48a75";
var arrayItemId = "5807cc08959ca331f09c530e"; //Id for foo

var unit = new Unit(...)
var filter = Builders<UnitType>.Eq(o => o.Id, mainDocumentId); // optional
filter amp;= Builders<UnitType>.Filter.ElemMatch(o => o.Units, o => o.Id == arrayItemId);
var update = Builders<UnitType>.Update.Set(o => o.Units[-1], unit);

collection.UpdateOne(filter, update);
  

Ответ №2:

Предполагая, что ваши модели на C # выглядят следующим образом:

 public class UnitLog
{
    [BsonRepresentation(BsonType.ObjectId)]
    [BsonId]
    public string Id { get; set; }

    public string Code { get; set; }

    public List<Unit> Units { get; set; }
}

public class Unit
{
    [BsonRepresentation(BsonType.ObjectId)]
    [BsonId]
    public string Id { get; set; }

    public string Code { get; set; }

    public string Label { get; set; }
}
  

Вы могли бы использовать PullFilter для извлечения элемента из встроенного массива. Вот пример с драйвером MongoDB 2.0:

 var mainDocumentId = "5807c22e959ca231f0c48a75";//Your containing document's Id
var arrayItemId = "5807cc08959ca331f09c530e";//Id for array item with Code=foo

var pullFilter = Builders<UnitLog>.Update.PullFilter(
        x => x.Units,
        x => x.Id == arrayItemId 
    );

//Note that you would use Collection.UpdateManyAsync()  
//if you expected more than one item to be updated/pulled
var result = await Collection.UpdateOneAsync(
        x => x.Id == mainDocumentId,
        pullFilter
    ).ConfigureAwait(false);
  

Для идентификации элементов во встроенном массиве вы должны использовать $elemMatch для этого

elemMatch документация MongoDB

Можно найти соответствие элементам

 Builders<UnitLog>.Filter.ElemMatch 
  

И может использоваться совместно с $set для обновления отдельных свойств встроенных документов, определенных с помощью $elemMatch.

Загляните в addToSet, вы можете найти это полезным, поскольку он добавляет элемент в массив, если элемент уже не существует

Добавить документацию по MongoDB

Можно найти addToSet

 Builders<UnitLog>.Update.AddToSet