使用csharp mongodb驱动程序,如何更新列表中的项目?

时间:2017-06-16 18:23:50

标签: c# mongodb

我试图通过匹配项目' voteId'来尝试更新voteResultList中的项目。字段。

文件:

db.getCollection('VoteCollection').update({'voteDocumentId': '....', 'voteResultList.voteId': '....'},{'$set': {'voteResultList.$.voteResult': 'Approve'}})

如果在mongo中我可以使用此命令并且它可以正常工作。

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

在使用csharp mongo驱动程序的csharp代码中,我从这个json文档中生成了一个过滤器bson文档

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

然后我通过此代码生成了更新bson文档

Share_nonesafe

但显然我没有正确地执行此操作,因为在调用MongoCollection.UpdateMany(filter,update)之后,mongoUpdateResult.ModifiedCount = 0,并且mongodb文档中没有任何更改。

那么这样做的正确方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是基于答案的完整工作示例: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();
        }
    }
}