2017-06-16 49 views
1

我想通過匹配項目的'voteId'字段來更新voteResultList中的項目。使用csharp mongodb驅動程序,如何更新列表中的項目?

文件:

{ 
    voteDocumentId: "....", 
    voteResultList: [ 
     { 
      voteId: "....", 
      voteResult: "NA" 
     }, 
     { 
      voteId: "....", 
      voteResult: "Against" 
     } 
     .... 
    ] 
} 

如果蒙戈我可以使用此命令,它能夠正常工作。

db.getCollection('VoteCollection').update({'voteDocumentId': '....', 'voteResultList.voteId': '....'},{'$set': {'voteResultList.$.voteResult': 'Approve'}}) 
在CSHARP代碼使用CSHARP蒙戈驅動

,我生成從該JSON文檔

{'voteDocumentId': '....', 'voteResultList.voteId': '....'} 

然後我由此代碼生成的更新BSON文件的濾波器BSON文檔

Builders<BsonDocument>.Update.Set("voteResultList.$.voteResult", "Approve") 

但顯然我沒有正確地做到這一點,因爲在調用MongoCollection.UpdateMany(filter,update),mongoUpdateResult.ModifiedCount = 0之後,MongoDB文檔中沒有任何更改。

那麼這樣做的正確方法是什麼?

謝謝!

+0

的可能的複製[蒙戈更新數組元素(.NET 2.0驅動程序)](https://stackoverflow.com/questions/31453681/mongo-update-array-element-net-driver-2-0) – dnickless

回答

0

這裏的基礎上,答案在這裏爲您的情況下一個完整的工作示例:Mongo update array element (.NET driver 2.0)

using MongoDB.Bson; 
using MongoDB.Driver; 
using System; 
using System.Linq; 

namespace ConsoleApp1 
{ 
    public class VoteCollection 
    { 
     public ObjectId Id; 
     public string voteDocumentId; 
     public VoteResult[] voteResultList; 
    } 

    public class VoteResult 
    { 
     public string voteId; 
     public string voteResult; 
    } 

    public class Program 
    { 
     public static IMongoDatabase _db; 

     static void Main(string[] args) 
     { 
      var collection = new MongoClient().GetDatabase("test").GetCollection<VoteCollection>("VoteCollection"); 

      collection.InsertOne 
      (
       new VoteCollection 
       { 
        voteDocumentId = "foo", 
        voteResultList = new [] 
        { 
         new VoteResult { voteId = "bar1", voteResult = "NA" }, 
         new VoteResult { voteId = "bar2", voteResult = "Against" }, 
        } 
       } 
      ); 

      var filter = Builders<VoteCollection>.Filter.Where(voteCollection => voteCollection.voteDocumentId == "foo" && voteCollection.voteResultList.Any(voteResult => voteResult.voteId == "bar1")); 
      var update = Builders<VoteCollection>.Update.Set(voteCollection => voteCollection.voteResultList[-1].voteResult, "Approve"); 
      collection.UpdateMany(filter, update); 

      Console.ReadLine(); 
     } 
    } 
} 
+0

它的工作原理!非常感謝! – IPE

相關問題