使用等于值迭代文档

时间:2012-11-09 18:11:02

标签: mongodb mongodb-query database nosql

我在mongo db中有一些博客文章和“投票”字段:

> db.posts.find({}, {_id:0, votes: 1})
{ "votes" : 1 }
{ "votes" : 2 }
{ "votes" : 2 }
{ "votes" : 3 }
{ "votes" : 3 }

比我有一个网页界面,每页显示一个帖子和控件(下一个,上一个)来滑动按投票排序的帖子。我将具有当前投票数的下一个/上一篇文章的请求发送到服务器并选择新的。所以我得到下一个查询(每个http请求一个)

> db.things.find({vote: {$gt: 0}}, {_id:0, votes:1}).limit(1) // current votes == 0
{ "votes" : 1 }
> db.things.find({vote: {$gt: 1}}, {_id:0, votes:1}).limit(1) // current votes == 1
{ "votes" : 2 }
> db.things.find({vote: {$gt: 2}}, {_id:0, votes:1}).limit(1) // current votes == 2
{ "votes" : 3 }
...

你可以看到等于“投票”的文件被跳过。所以我需要一些方法来使文档独一无二,并且迭代等于投票(投票字段可能经常更新,并且每个文档都有许多等于值)。

有什么方法可以解决这个问题吗?看起来我需要某种搜索索引。但正如我所说,标准字段变化非常频繁,我计划有数百万份文档。这意味着索引更新将是非常昂贵的操作,我希望系统在更新时安全响应。

1 个答案:

答案 0 :(得分:0)

如果您不关心结果返回的顺序,则应按_id对其进行排序,然后使用{$gt: current_id}获取下一个:

db.things.findOne({}, {votes: 1}).sort({_id: 1}) // _id == 0
db.things.findOne({_id: {$gt: 0}}, {votes: 1}).sort({_id: 1}) // _id == 1
db.things.findOne({_id: {$gt: 1}}, {votes: 1}).sort({_id: 1}) // _id == 2
...

如果您需要按votes订购,则需要使用skip代替:

db.things.findOne({}, {votes: 1}).sort({votes: 1})
db.things.findOne({}, {votes: 1}).sort({votes: 1}).skip(1)
db.things.findOne({}, {votes: 1}).sort({votes: 1}).skip(2)
...

但随着你不得不进一步跳到结果集,这会逐渐变慢。