使用MongoDB C#驱动程序进行分支

时间:2016-08-26 10:52:40

标签: c# mongodb

我正在尝试在MongoDb中实现一种称为bucketing的技术(或者在MongoDB研讨会中称之为),它使用Push和Slice来实现这一目标。这是为了实现类似于twitter / facebook的用户馈送系统。

基本上我有一个包含一系列项目(供稿项目)的文档。我想在这个项目数达到用户的特定数量时创建一个新文档。

因此,如果最新的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 }

但显然不是。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

因此,在写完问题并大声说出几次后,我意识到问题所在。

我需要在主要的userfeed文档上有一个计数器,每次添加一个项目时(需要发布一个feed项目),该计数器需要递增。在我的查询中执行更新/ upsert我只需要检查&lt; 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);

如果从items数组中删除了用户提要项,则只要计数未得到纠正,一切都应按预期工作。但是,如果您修改删除计数会出现问题,因为您最终将添加到以前文档中的项目,并且您需要在展开数据后执行排序,这是目前我不需要的。这确实意味着你最终会得到一些阵列中少于50个项目的文档,但对我来说并不重要。

我希望这有助于某人尝试在c#中实现类似的解决方案。