我有一份文件如下:
{
'_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);
}
此操作只能在一个请求中完成吗?或者唯一的方法是先找到文档,然后再决定更新文档的方式。
答案 0 :(得分:0)
我无法想到使用此数据结构在一个请求中更简洁的方法。
如果您更改数据结构以添加包含父内容的用户,值和ObjectId的newColour = Application.Dialogs(xlDialogEditColor).Show(1)
If newColour Then
Range("A1").Interior.Color = ActiveWorkbook.Colors(1)
End If
集合,则可以在一个请求中执行此操作。
然后你可以做一个简单的votes
,它会在一个请求中处理所有事情。获得所有投票将是对具有相关父内容的所有投票的查询查询。