我有一个看起来像这样的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 } } });
但是我在编译时总是遇到错误,说它期待另一个非常接近的问题。
答案 0 :(得分:1)
您可以使用$ slice实现此目的
https://docs.mongodb.com/manual/reference/operator/update/slice/
此外,如果您不想删除任何评论,但只想限制数组大小可以在一个文档中,您可以使用一种称为&#34; Bucketing&的有用技巧#34 ;.这是一个概述C#
中的技术和语法的问题答案 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);