27

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

例如这个文件:有db.myCollection.find({"id":12345}) 索引3myCollection

myCollection:
    id: 12340, name: 'G'
    id: 12343, name: 'V'
    id: 12345, name: 'A'
    id: 12348, name: 'N'
4

6 回答 6

42

如果您的要求是查找文档的位置而不考虑任何顺序,那么这是不可能的,因为 MongoDb 不会按特定顺序存储文档。但是,如果您想知道基于某个字段的索引,例如_id,您可以使用此方法。

如果您在您的_id领域严格遵循自动增量。您可以计算所有价值小于该值的文档_id,例如 n ,然后 n + 1 将是基于 的文档的索引_id

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

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

于 2012-05-30T11:17:38.683 回答
4

据我所知,没有单一的命令可以做到这一点,这在一般情况下是不可能的(见德里克的回答)。但是,count()用于对有序 id 值字段进行的查询似乎有效。警告:这假设有一个可靠排序的字段,这在并发编写器的情况下很难实现。在此示例_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()也应该在所有驱动程序库中都可用。

于 2012-05-30T10:06:47.693 回答
3

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

var docIndex = 0;
db.url_list.find({},{"_id":1}).forEach(function(doc){
  docIndex++;
  if("5801ed58a8242ba30e8b46fa"==doc["_id"]){
    print('document position is...' + docIndex);
    return false;
  }
});
于 2016-10-17T03:03:11.560 回答
1

MongoDB 无法返回它,因为它不会在数据库中保持文档的顺序,就像 MySQL fe 不命名行号一样。

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

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

于 2012-05-30T10:11:12.233 回答
0

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

于 2017-05-31T10:13:55.287 回答
0

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

于 2018-09-22T16:36:46.450 回答