C# 使用筛选器更新或替换文档字段(数组)项

C# 使用筛选器更新或替换文档字段(数组)项,c#,mongodb,mongodb-query,C#,Mongodb,Mongodb Query,我有一份文件如下: { '_id': ObjectId('AAABBBCCC'), 'content': 'This is content.' 'votes': [ { 'user': ObjectId('UserIdOfA'), 'value': 1 }, { 'user': ObjectId('UserIdOfB'), 'value': 2 }, { 'user': ObjectId('UserIdOfC'), 'val

我有一份文件如下:

{
    '_id': ObjectId('AAABBBCCC'),
    'content': 'This is content.'
    'votes': [
        { 'user': ObjectId('UserIdOfA'), 'value': 1 },
        { 'user': ObjectId('UserIdOfB'), 'value': 2 },
        { 'user': ObjectId('UserIdOfC'), 'value': 3 }
    ]
}
每个用户只能有一票。用户可以随时更改投票,甚至删除投票。 如何构建查询和更新:1。如果投票数组已具有用户投票,请设置该值或替换整个投票,2。如果投票中没有投票,请插入

这是我尝试过但失败的代码,出现“无法更新”投票“和“同时更新”投票”异常

public Task<UpdateResult> AddVoteAsync(ObjectId id, UserVote vote)
{
    var filter = Builders<Topic>.Filter.Eq(x => x.Id, id);
    var update = Builders<Topic>.Update
        .PullFilter(x => x.Votes, Builders<UserVote>.Filter.Eq(x => x.UserId, vote.UserId))
        .AddToSet(x => x.Votes, vote);
    return this.collection.UpdateOneAsync(filter, update);
}
public Task AddVoteAsync(ObjectId,UserVote)
{
var filter=Builders.filter.Eq(x=>x.Id,Id);
var update=Builders.update
.PullFilter(x=>x.vote,Builders.Filter.Eq(x=>x.UserId,vote.UserId))
.AddToSet(x=>x.投票,投票);
返回this.collection.UpdateOneAsync(过滤器,更新);
}

只能在一个请求中完成此操作吗?或者,唯一的方法是先找到文档,然后再决定更新它的方式。

我想不出一种更简洁的方法来使用此数据结构在一个请求中完成此操作

如果更改数据结构以添加包含用户、值和父内容ObjectId的
投票集,则可以在一个请求中完成此操作


然后,您可以执行一个简单的
upsert
,在一个请求中完成所有操作。获取所有投票将是一个查找具有相关父内容的所有投票的查询。

我想不出一种更简洁的方法来使用此数据结构在一个请求中完成此操作

如果更改数据结构以添加包含用户、值和父内容ObjectId的
投票集,则可以在一个请求中完成此操作

然后,您可以执行一个简单的
upsert
,在一个请求中完成所有操作。获取所有投票将是一个查找具有相关父内容的所有投票的查询