获取所选文档在集合中的位置[mongoDB]

时间:2012-05-30 09:52:45

标签: mongodb collections find position

如何在mongo集合中获取所选文档的位置(索引)?

E.g。 本文件:db.myCollection.find({"id":12345})3

中有索引myCollection
myCollection:
    id: 12340, name: 'G'
    id: 12343, name: 'V'
    id: 12345, name: 'A'
    id: 12348, name: 'N'

6 个答案:

答案 0 :(得分:30)

如果您的要求是查找文档的位置而不管任何顺序,则不是 因为MongoDb不按特定顺序存储文档。 但是,如果您想根据某些字段知道索引,例如_id,则可以使用此方法。

如果您在_id字段中严格遵循自动增量。您可以统计所有文件 如果值小于_id,比如n,则n + 1将是基于_id的文档索引。

n = db.myCollection.find({"id": { "$lt" : 12345}}).count() ;

如果从集合中删除文档,这也是有效的。

答案 1 :(得分:3)

据我所知,没有一个命令可以做到这一点,这在一般情况下是不可能的(参见Derick的回答)。但是,在有序的id值字段上执行查询时使用count()似乎可行。 警告:这假定存在可靠的有序字段,这在并发编写器案例中很难实现。在此示例中,使用_id,但这只适用于单个编写器案例。

MongoDB shell version: 2.0.1
connecting to: test
> use so_test
switched to db so_test
> db.example.insert({name: 'A'})
> db.example.insert({name: 'B'})
> db.example.insert({name: 'C'})
> db.example.insert({name: 'D'})
> db.example.insert({name: 'E'})
> db.example.insert({name: 'F'})
> db.example.find()
{ "_id" : ObjectId("4fc5f040fb359c680edf1a7b"), "name" : "A" }
{ "_id" : ObjectId("4fc5f046fb359c680edf1a7c"), "name" : "B" }
{ "_id" : ObjectId("4fc5f04afb359c680edf1a7d"), "name" : "C" }
{ "_id" : ObjectId("4fc5f04dfb359c680edf1a7e"), "name" : "D" }
{ "_id" : ObjectId("4fc5f050fb359c680edf1a7f"), "name" : "E" }
{ "_id" : ObjectId("4fc5f053fb359c680edf1a80"), "name" : "F" }
> db.example.find({_id: ObjectId("4fc5f050fb359c680edf1a7f")})
{ "_id" : ObjectId("4fc5f050fb359c680edf1a7f"), "name" : "E" }
> db.example.find({_id: {$lte: ObjectId("4fc5f050fb359c680edf1a7f")}}).count()
5
> 

如果查询的字段被索引,这也应该相当快。该示例位于mongo shell中,但count()也应该在所有驱动程序库中可用。

答案 2 :(得分:2)

这可能是非常缓慢但直接的方法。在这里你可以照常传递查询。我正在循环所有文档并检查条件是否与记录匹配。在这里,我正在检查_id字段。您可以使用任何其他单个字段或多个字段进行检查。

model

答案 3 :(得分:1)

MongoDB无法返回此内容,因为它不会在数据库中按顺序保存文档,就像MySQL f.e.没有命名行号。

来自jhonkola的ObjectID技巧仅在一个客户端创建新元素时才有效,因为ObjectID是在客户端生成的,第一部分是时间戳。如果不同的客户端与同一服务器通信,则无法保证订单。不过,我不会依赖这个。

我也不太了解你想要做什么,所以也许在你的问题中提到这一点?然后我可以更新答案。

答案 4 :(得分:0)

重新构建您的集合以包含任何条目的位置,即{'id':12340,'name':'G','position':1}然后在使用所需位置搜索数据库集合(myCollection)时查询

答案 5 :(得分:0)

我使用的返回整个集合的查询都使用sort来获得可重复的订单,find.sort.forEach与上面的脚本一起使用以获取正确的索引。