在Mongo中查询N个第一和M个最后文档

时间:2015-06-22 20:21:03

标签: mongodb meteor

一切都在问题中:我找不到一种有效的方法来返回查询的第一个和最后两个文档......

我传入了包含所需的_id的参数和数组,我用{ parentPost: { $in: myArray } }选择了,但我不知道如何在同一个查询中获得两个持续时间和第一个文档... < / p>

目标是返回一个文档集合,其中包含我可以在一个订阅中返回的单个查询中包含每个线程的所有通缉帖子(由parentPost标识)。

有人能照亮我的道路吗?

谢谢

大卫

1 个答案:

答案 0 :(得分:0)

我假设每个帖子都在一个单独的文档中,我们可以在其中过滤其他字段,例如name。 让我们从2个查询示例开始,直到#34;完成它。&#34;假设文档中的某些内容可以像邮件编号或日期时间字段那样进行排序,那么这显然可行。

c = db.foo.find({"name": "matt"}).sort({"post":1}).limit(N);
c.forEach(function(r) { printjson(r); });
c = db.foo.find({"name": "matt"}).sort({"post":-1}).limit(M);
c.forEach(function(r) { printjson(r); });

当然,如果你没有可排序的东西,那就去基于自然的磁盘订购:

c = db.foo.find({"name": "matt"}).sort({"$natural":1}).limit(N);
c.forEach(function(r) { printjson(r); });
c = db.foo.find({"name": "matt"}).sort({"$natural":-1}).limit(M);
c.forEach(function(r) { printjson(r); });

这是一个变种。它可能更快,因为它避免了仅排序两次以将输出限制为几件事:

n = db.foo.find({"name": "matt"}).count();
c = db.foo.find({
    "name": "matt",
    "$or": [
      {"post": {$lte: N}}
      ,{"post": {$gte: n-M}}
            ]
     });
相关问题