在mongodb中限制嵌套数组的大小c#

时间:2018-01-11 00:38:14

标签: c# mongodb

我有一个看起来像这样的mongodb对象:

{
    "_id" : "5a567ef6992fb9020474f72d",
    "groupName" : "test, admin, binky, water, brick",
    "users" : [ 
        "test", 
        "admin", 
        "binky", 
        "water", 
        "brick"
    ],
    "comments" : [ 
        {
            "comment" : "test message",
            "createdBy" : "admin",
            "createdAt" : ISODate("2018-01-11T00:01:59.672Z")
        },
        {
            "comment" : "test message",
            "createdBy" : "admin",
            "createdAt" : ISODate("2018-01-11T00:02:48.237Z")
        }
    ],
    "createdBy" : "admin"
}

所以,我的问题是我不希望评论的数量无限增长。我希望能够限制可能的评论数量。

无论如何都要在插入时查看注释的数量,然后可能会删除超过100的前几个注释?所以,假设我们得到101,它会删除第一个对象???

我添加评论的代码是:

var coll = DatabaseCommon.Instance.GetDatabase("ps_" + siteId).GetCollection<Group>("chatgroups");

var currentGroup = coll.FindOneAndUpdate(y => y._id == groupId, Builders<Group>.Update.Push<Comment>(y => y.comments, comment));

我试过了:

var coll = DatabaseCommon.Instance.GetDatabase("ps_" + siteId).GetCollection<Group>("chatgroups");
coll.UpdateOne({ _id: groupId }, { $push: { comments: { $each: [comment], $slice: -100 } } });

但是我在编译时总是遇到错误,说它期待另一个非常接近的问题。

screenshot of error

2 个答案:

答案 0 :(得分:1)

您可以使用$ slice实现此目的

https://docs.mongodb.com/manual/reference/operator/update/slice/

此外,如果您不想删除任何评论,但只想限制数组大小可以在一个文档中,您可以使用一种称为&#34; Bucketing&的有用技巧#34 ;.这是一个概述C#

中的技术和语法的问题

Bucketing with MongoDB C# Driver

答案 1 :(得分:0)

所以,我分四步解决了这个问题。首先,找到记录:

var coll = DatabaseCommon.Instance.GetDatabase("ps_" + siteId).GetCollection<Group>("chatgroups");
var record = coll.Find(y => y._id == groupId).Single();

然后,添加新评论:

record.comments.Add(comment);

然后,只收到最后100条评论:

record.comments = record.comments.Skip(Math.Max(0, record.comments.Count - 100)).ToList();

保存更改的记录:

coll.ReplaceOne(y => y._id == groupId, record);