MongoDb使用过滤/排序查询嵌入式集合
本文关键字:查询 嵌入式 集合 排序 过滤 MongoDb | 更新日期: 2023-09-27 18:07:03
让我们想象一个普通的博客引擎(仅举个例子)。该模型将由Posts collection和嵌入评论"collection"组成。
现在,我只需要得到10个最近的评论以及我的Post数据。
- 最好的方法是什么? 这是一个有价值的优化吗?(除减少网络流量外)
注:我使用官方的c#驱动+ fluent-mongo,但我可以放弃linq,因为一个好的原因。
不能使用Slice命令检索数组的子集(最后10个)吗?比如:
db.posts.find({}, {comments:{$slice: -10}})
当我不得不做类似的事情时,我在官方文档中找到了这个。
链接:http://www.mongodb.org/display/DOCS/Retrieving + + + +字段的子集# RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements
我能找到的在c#中使用slice命令的最简单方法是:
var your_query;
var slice = Fields.Slice("comments", -10);
var cursor = collection.Find(your_query).SetFields(slice);
foreach (var document in cursor) {
...
}
为什么不使用一个专门的最新评论集合呢?在发布评论时,必须执行两次插入操作,但是获取最新的评论很简单。通常情况下,获取这些内容的频率要比发布新评论的频率高得多。
正如Steve B所指出的,这是一个典型的"视图",因为这个集合可能包含与post集合中的评论略有不同的信息。例如,您可能希望在每个评论中存储帖子id和帖子名称,以便可以显示相应的链接。
您可以使用一个上限集合,例如100个元素,它会自动删除旧的注释(即实现FIFO)