搜索有限数量的记录MongoDB

时间:2013-12-26 23:09:10

标签: mongodb find limit record

我想搜索名为CityDB的文档的前1000条记录。我使用了以下代码:

db.CityDB.find({'index.2':"London"}).limit(1000)

但它不起作用,它返回前1000个查找,但我想只搜索前1000个记录而不是所有记录。你能帮我吗?

谢谢, 阿米尔

2 个答案:

答案 0 :(得分:4)

请注意,只要您没有明确排序,就不能保证您的文档按查询以任何特定顺序返回。新集合中的文档通常以插入顺序返回,但是各种各样的事情可能导致该顺序意外更改,因此不要依赖它。顺便说一句:自动生成的_id以时间戳开头,因此当您按_id排序时,对象将按创建日期返回。

现在谈谈你的实际问题。当您首先要限制文档然后在此有限集上执行过滤操作时,可以使用聚合管道。它允许您先使用$limit-operator,然后在剩余文档上使用$match-operator

db.CityDB.aggregate( 
 // { $sort: { _id: 1 } }, // <- uncomment when you want the first 1000 by creation-time
    { $limit: 1000 },
    { $match: { 'index.2':"London" } }
)

答案 1 :(得分:1)

我可以想到两种方法来实现这个目标:

1)您有一个global counter,每次您在集合中输入数据时,都会添加一个字段count = currentCounter并将currentCounter增加1.当您需要选择你的第一个k元素,你会发现这种方式

db.CityDB.find({
  'index.2':"London",
  count : {
    '$gte' : currentCounter - k
  }
})

这不是原子的,有时可能会在重载系统上给你更多k元素(但它可以支持索引)。

这是另一种在shell中运行良好的方法:

2)创建虚拟数据:

var k = 100;
for(var i = 1; i<k; i++){
  db.a.insert({
     _id : i,
     z: Math.floor(1 + Math.random() * 10)
  })
}

output = [];

现在在k

的第一个z == 3记录中找到
k = 10;
db.a.find().sort({$natural : -1}).limit(k).forEach(function(el){
  if (el.z == 3){
     output.push(el)
  }
})

正如您所看到的输出具有正确的元素:

output

我认为根据您的需要修改我的示例非常简单。

P.S。还看一下聚合框架,可能有办法用它来实现你需要的东西。