【问题标题】:MongoDb querying embedded collection with filtering/orderingMongoDb 使用过滤/排序查询嵌入式集合
【发布时间】:2011-08-31 12:09:23
【问题描述】:

让我们想象一个普通的博客引擎(仅作为示例)。该模型将包含带有嵌入式评论“集合”的帖子集合。

现在,我只需要获取 10 个最近的 cmets 以及我的 Post 数据。

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

附:我使用官方 C# 驱动程序 + fluent-mongo,但我可以出于正当理由放弃 linq。

【问题讨论】:

  • 不是直接的答案,但您可以看看 CQRS 模式......在您的情况下,这个想法应该是对最近的 cmets 的视图进行非规范化。 Ncqrs framework 可能是一个很好的起点
  • @Steve:该链接对我不起作用:(
  • 谢谢,史蒂夫。我知道CQRS。事实上,我在这个项目中使用它,但是没有单独的“非规范化”存储,我使用 mongodb 来处理所有事情。我的问题显然与查询部分有关,我需要一种快速方法来仅查询视图的必要数据。我认为您的建议是添加另一个子集以及完整的集合或仅查看数据的单独集合?我可以这样做,但也许还有其他方法。
  • @Kostassoid,看看这里这个网站可能会有所帮助chrisedwards.dreamhosters.com/blog/2010/05/29/…
  • @zooone9243,你是对的,事实上我最近发现了这本书并开始阅读它。我以前没有听说过这个词的原因是因为他们显然决定放弃它。但我会更新标题,谢谢。

标签: c# mongodb mongodb-.net-driver fluent-mongo


【解决方案1】:

您不能使用 Slice 命令检索数组的子集(最后 10 个)吗? 比如:

db.posts.find({}, {comments:{$slice: -10}})

当我不得不做类似的事情时,我在官方文档中发现了这一点。

链接:http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#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) { 
    ...
} 

【讨论】:

  • 很有趣,谢谢。不是我真正想要的,但在某些情况下确实是一个很好的解决方案。现在我知道 10gen 正在开发虚拟收藏品,这正是我所需要的,AFAIK。
【解决方案2】:

为什么不使用最新 cmets 的专用集合?发布评论时,您必须执行两次插入,但获取最新的 cmets 很简单。通常,您获取这些内容的频率要比发布新评论的频率高得多。

正如 Steve B 所指出的,这通常是一个“视图”,因为此集合可能包含与帖子集合中的 cmets 略有不同的信息。例如,您可能希望在每条评论中存储帖子 ID 和帖子名称,以便显示相应的链接。

您可以使用 capped collection,例如 100 个元素,它会自动删除旧的 cmets(即实现 FIFO)

【讨论】:

  • 是的,我知道上限集合,如果我需要整个博客的最新 cmets,这将是一个很好的解决方案,但我需要每个帖子的最新内容。在我的情况下,“帖子”计数> 1000000 并且还在计数,我不知道如何计算上限集合的大小。使用专用集合看起来是一个很好的解决方案,我只是好奇是否有一种方法可以使用动态设置的过滤器查询数据。
猜你喜欢
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 2016-05-02
  • 2011-05-15
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多