【问题标题】:Using csharp mongodb driver, how to update an item from list?使用 csharp mongodb 驱动程序,如何更新列表中的项目?
【发布时间】:2017-06-16 18:23:49
【问题描述】:

我正在尝试通过匹配项目的“voteId”字段来更新 voteResultList 中的项目。

文件:

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

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

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

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

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

然后我通过这段代码生成了一个更新的 bson 文档

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

但显然我做得不对,因为在调用 MongoCollection.UpdateMany(filter, update) 之后,mongoUpdateResult.ModifiedCount = 0,mongodb 文档中没有任何变化。

那么正确的做法是什么?

谢谢!

【问题讨论】:

标签: c# mongodb


【解决方案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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多