与MongoDB C#驱动器进行扣合

与MongoDB C#驱动器进行扣合,c#,mongodb,C#,Mongodb,我正在尝试在MongoDb中实现一种称为bucketing的技术(或者在MongoDb研讨会中被称为bucketing),它使用推送和切片来实现这一点。这是为了实现一个类似于twitter/facebook的用户反馈系统 基本上,我有一个带有项目数组(提要项目)的文档。我想在项目数量达到某个用户的特定数量时创建一个新文档 因此,如果最新的userFeed文档集合有50个项目,我希望创建一个新文档,并将新项目插入到新创建文档的项目数组中 这是我迄今为止的代码: var update = Build

我正在尝试在MongoDb中实现一种称为bucketing的技术(或者在MongoDb研讨会中被称为bucketing),它使用推送和切片来实现这一点。这是为了实现一个类似于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);

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

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

我需要在主userfeed文档上设置一个计数器,每次添加一个项目(发布一个feed项目)时,该计数器都需要递增。在执行更新/升级的查询中,我只需要检查<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);
var update=Builders
.更新
.CurrentDate(x=>x.DateLastUpdate)
.PushEach(x=>
x、 项目,
新列表{feedItem},
50)
.Inc(x=>x.计数,1);
var result=await Collection.UpdateOneAsync(x=>
x、 User.Id==userFeedToWriteTo&&x.Count<50,
更新,
新的更新选项{IsUpsert=true}
).配置等待(错误);
如果从items数组中删除了一个用户提要项,那么只要没有更正计数,一切都应该按预期进行。但是,如果修改删除时的计数,则会出现问题,因为最终会将项目添加到以前的文档中,并且在释放数据后需要执行排序,目前我不需要这样做。这确实意味着您将得到一些数组中的项目少于50个的文档,但对我来说这并不重要


我希望这能帮助那些试图在c#中实现类似解决方案的人。

因此,在写下问题并大声说了几遍之后,我意识到了问题所在

我需要在主userfeed文档上设置一个计数器,每次添加一个项目(发布一个feed项目)时,该计数器都需要递增。在执行更新/升级的查询中,我只需要检查<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);
var update=Builders
.更新
.CurrentDate(x=>x.DateLastUpdate)
.PushEach(x=>
x、 项目,
新列表{feedItem},
50)
.Inc(x=>x.计数,1);
var result=await Collection.UpdateOneAsync(x=>
x、 User.Id==userFeedToWriteTo&&x.Count<50,
更新,
新的更新选项{IsUpsert=true}
).配置等待(错误);
如果从items数组中删除了一个用户提要项,那么只要没有更正计数,一切都应该按预期进行。但是,如果修改删除时的计数,则会出现问题,因为最终会将项目添加到以前的文档中,并且在释放数据后需要执行排序,目前我不需要这样做。这确实意味着您将得到一些数组中的项目少于50个的文档,但对我来说这并不重要

我希望这能帮助尝试在c#中实现类似解决方案的人