Bucketing with MongoDB C# Driver

本文关键字:Driver MongoDB with Bucketing | 更新日期: 2023-09-27 18:04:12

我试图在MongoDb中实现一种称为bucket的技术(或者它被称为MongoDb研讨会),它使用Push和Slice来实现这一目标。这是为了实现一个类似于twitter/facebook的用户feed系统。

实际上我有一个包含条目(提要条目)数组的文档。当用户的项目数达到一定数量时,我想创建一个新文档。

所以,如果最新的userFeed文档的集合有50个条目,我希望创建一个新文档,并将新条目插入到新创建文档的条目数组中。

这是我到目前为止的代码:

var update = Builders<UserFeed>
    .Update
    .CurrentDate(x => x.DateLastUpdated)
    .PushEach(x =>
        x.Items,
        new List<FeedItemBase> { feedItem },
        50);
var result = await Collection.UpdateOneAsync(x =>
    x.User.Id == userFeedToWriteTo,
    update,
    new UpdateOptions { IsUpsert = true }
    ).ConfigureAwait(false);

但是它似乎没有创建一个新文档,甚至没有将项插入到现有文档的数组中。我认为新文档的创建将由这个

来处理。
new UpdateOptions { IsUpsert = true }

但显然不是。如有任何帮助,不胜感激

Bucketing with MongoDB C# Driver

所以在把问题写出来并大声说了几遍之后,我意识到问题出在哪里。

我需要在主userfeed文档上添加一个计数器,每次添加一个条目(发布一个提要条目)时都需要增加该计数器。在我的查询执行更新/upsert我只需要检查<50. 之后,一切都按预期进行。这是更正后的代码

var update = Builders<UserFeed>
    .Update
    .CurrentDate(x => x.DateLastUpdated)
    .PushEach(x =>
        x.Items,
        new List<FeedItemBase> { feedItem },
        50)
    .Inc(x => x.Count, 1);
var result = await Collection.UpdateOneAsync(x =>
    x.User.Id == userFeedToWriteTo && x.Count < 50,
    update,
    new UpdateOptions { IsUpsert = true }
    ).ConfigureAwait(false);

如果用户提要条目从条目数组中删除,只要计数没有更正,一切都应该按预期工作。但是,如果修改删除计数,就会出现问题,因为最终会有项目添加到以前的文档中,并且在展开数据之后需要执行排序,而目前还不需要这样做。这确实意味着你最终会得到一些数组中条目少于50项的文档,但对我来说,这并不重要。

我希望这对试图在c#中实现类似解决方案的人有所帮助。