MongoDb使用过滤/排序查询嵌入式集合

本文关键字:查询 嵌入式 集合 排序 过滤 MongoDb | 更新日期: 2023-09-27 18:07:03

让我们想象一个普通的博客引擎(仅举个例子)。该模型将由Posts collection和嵌入评论"collection"组成。

现在,我只需要得到10个最近的评论以及我的Post数据。

  1. 最好的方法是什么?
  2. 这是一个有价值的优化吗?(除减少网络流量外)

注:我使用官方的c#驱动+ fluent-mongo,但我可以放弃linq,因为一个好的原因。

MongoDb使用过滤/排序查询嵌入式集合

不能使用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)