2016-10-19 1 views
0

У меня есть документ, который имеет встроенный массив единиц, как это:Заменить встроенный документ с использованием Монго C# 2.0 драйвера

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

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

Заранее благодарен!

+0

что вы сделали до сих пор? –

+0

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

ответ

3

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

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

var unit = new Unit(...) 
var filter = Builders<UnitType>.Eq(o => o.Id, mainDocumentId); // optional 
filter &= 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); 
+0

Рад, что я мог бы помочь. ElemMatch - хорошее решение здесь – pieperu

3

Предполагая, что ваши модели в 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 documentation

ElemMatch можно найти

Builders<UnitLog>.Filter.ElemMatch 

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

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

AddToSet MongoDb documentation

AddToSet можно найти

Builders<UnitLog>.Update.AddToSet