我试图通过匹配项目' 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文档中没有任何更改。
那么这样做的正确方法是什么?
谢谢!
答案 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();
}
}
}