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

时间:2017-09-06 22:52:46

标签: 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'), '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);
}

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

1 个答案:

答案 0 :(得分:0)

我无法想到使用此数据结构在一个请求中更简洁的方法。

如果您更改数据结构以添加包含父内容的用户,值和ObjectId的newColour = Application.Dialogs(xlDialogEditColor).Show(1) If newColour Then Range("A1").Interior.Color = ActiveWorkbook.Colors(1) End If 集合,则可以在一个请求中执行此操作。

然后你可以做一个简单的votes,它会在一个请求中处理所有事情。获得所有投票将是对具有相关父内容的所有投票的查询查询。