2016-10-19 39 views
0

嵌入文檔中我有一個有單位嵌入式陣列,像這樣的文件:更換使用Mongo的C#2.0驅動程序

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

我想通過它的ID找到一個單元,並用新的文件替換它。 我該如何使用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 
相關問題