让我们想象一个普通的博客引擎(仅作为示例)。该模型将包含带有嵌入式评论“集合”的帖子集合。
现在,我只需要获取 10 条最近的评论以及我的帖子数据。
- 这样做的最佳方法是什么?
- 这是一个有价值的优化吗?(除了减少网络流量)
PS 我使用官方 C# 驱动程序 + fluent-mongo 但我可以放弃 linq 有一个好的理由。
让我们想象一个普通的博客引擎(仅作为示例)。该模型将包含带有嵌入式评论“集合”的帖子集合。
现在,我只需要获取 10 条最近的评论以及我的帖子数据。
PS 我使用官方 C# 驱动程序 + fluent-mongo 但我可以放弃 linq 有一个好的理由。
您不能使用 Slice 命令检索数组的子集(最后 10 个)吗?就像是:
db.posts.find({}, {comments:{$slice: -10}})
当我不得不做类似的事情时,我在官方文档中发现了这一点。
我能找到在 C# 中使用 slice 命令的最简单方法是:
var your_query;
var slice = Fields.Slice("comments", -10);
var cursor = collection.Find(your_query).SetFields(slice);
foreach (var document in cursor) {
...
}
为什么不使用最新评论的专用集合?发布评论时,您必须执行两次插入,但获取最新评论很简单。通常,您获取这些内容的频率要比发布新评论的频率高得多。
正如史蒂夫 B 指出的那样,这通常是一种“视图”,因为该集合可能包含与帖子集合中的评论略有不同的信息。例如,您可能希望在每条评论中存储帖子 ID 和帖子名称,以便显示相应的链接。
你可以使用一个有上限的集合,比如 100 个元素,它会自动删除旧评论(即,实现 FIFO)