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 }
但显然不是。如有任何帮助,不胜感激
所以在把问题写出来并大声说了几遍之后,我意识到问题出在哪里。
我需要在主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项的文档,但对我来说,这并不重要。