我想搜索名为CityDB的文档的前1000条记录。我使用了以下代码:
db.CityDB.find({'index.2':"London"}).limit(1000)
但它不起作用,它返回前1000个查找,但我想只搜索前1000个记录而不是所有记录。你能帮我吗?
谢谢, 阿米尔
答案 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。还看一下聚合框架,可能有办法用它来实现你需要的东西。