我正在尝试在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 }
但显然不是。任何帮助将不胜感激
答案 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#中实现类似的解决方案。