2017-01-19 116 views
1

我有這樣更新在蒙戈嵌套數組用C#

{ 
"_id": "63dafa72f21d48312d8ca405", 
"tasks": [{ 
    "_ref": "63d8d8d01beb0b606314e322", 
    "data": { 
     "values": [{ 
      "key": "Deadline", 
      "value": "2014-10-13" 
     }] 
    } 
}, { 
    "_ref": "84dd046c6695e32322d842f5", 
    "data": { 
     "values": [] 
    } 
}] 
} 

文檔現在我想更新中值值是內部數據,如果_ref場做配合我的輸入。

我迄今爲止代碼:

public bool updateProject(Project dbPro, Project pro) 
{ 
    var collection = db.GetCollection<BsonDocument>("projects"); 
    var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse(dbPro.Id)); 
    var update = Builders<BsonDocument>.Update.AddToSetEach("tasks", pro.Tasks); 
    var result = collection.UpdateOne(filter, update); 
    if (result.IsModifiedCountAvailable) 
    { 
     if (result.ModifiedCount == 1) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

目前這個代碼不只是附加的文件作爲新的任務,而不是將值追加到匹配的任務。也許有人有一個想法如何實現這種行爲?

UPDATE

我試着像@Shane Oborn說。但它仍然不適合我。

  var collection = db.GetCollection<BsonDocument>("projects"); 
     var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse(dbPro.Id)); 
     var update = Builders<BsonDocument>.Update.Push("tags", buildBsonArrayFromTags(pro.Tags)); 
     var result = collection.UpdateOne(filter, update); 
     if (result.IsModifiedCountAvailable) 
     { 
      if (result.ModifiedCount == 1) 
      { 
       return true; 
      } 

     } 


     return false; 
    } 

而不是重寫數據,它將數組附加到我的數組。

enter image description here

UPDATE

確定的,而不是推我確實需要設置。然後它就起作用了。

+1

看看[這個問題](http://stackoverflow.com/questions/ 18148166/find-document-with-array-that-c​​ontains-a-specific-value),它可以幫助你。 –

+0

謝謝。我會嘗試。 – Kleisophabo

回答

2

我沒有準確的代碼可訪問,但很接近。我有一個方法可以執行「upserts」(如果有新的話,它會「添加」,如果存在,則會「更新」)。這應該讓你關閉:

// The variable "doc" below is a BsonDocument 

var updateRequests = new List<WriteModel<BsonDocument>>(); 
updateRequests.Add(new ReplaceOneModel<BsonDocument>(
    CreateBsonDocumentFilterDefinition(filterKeyName, filterKeyValue), doc) 
    { 
     IsUpsert = true 
    }); 
var writeResult = await collection.BulkWriteAsync(updateRequests); 

的關鍵對象。你在這裏「ReplaceOneModel」和「IsUpsert」屬性過濾器定義。

祝你好運!

UPDATE:

我有做的子文檔更新的另一種方法是這樣的:

// Below, "subDocument" is a BsonDocument, and "subDocArrayName" is a string 
// that should match the name of the array that contains your sub-document 
// that will be updated. 

var collection = _database.GetCollection<BsonDocument>(collectionName); 

var builder = Builders<BsonDocument>.Update; 
var update = builder.Push(subDocArrayName, subDocument); 

await collection.UpdateOneAsync(CreateBsonDocumentFilterDefinition(filterKeyName, filterKeyValue), update); 
+0

我也會試一試。感謝您的快速幫助。 – Kleisophabo

+0

我試過你的方法,但沒有奏效。我更新了我的帖子 – Kleisophabo

+0

好吧,我現在想。而不是推我使用的設置。它的工作 – Kleisophabo