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



我有一个文档,如下所示:

{
'_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);
}

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

我想不出一种更简洁的方法可以在具有此数据结构的一个请求中做到这一点。

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

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

最新更新