Подтвердить что ты не робот

Получить позицию выбранного документа в коллекции [mongoDB]

Как получить позицию (индекс) выбранного документа в коллекции монго?

например. этот документ: db.myCollection.find({"id":12345}) имеет индекс 3 в myCollection

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

Ответ 1

Если ваше требование - найти позицию документа независимо от какого-либо заказа, то это не возможно, поскольку MongoDb не сохраняет документы в определенном порядке. Однако, если вы хотите знать индекс на основе некоторого поля, скажем _id, вы можете использовать этот метод.

Если вы строго выполняете автоматические приращения в своем поле _id. Вы можете считать все документы которые имеют значение меньше, чем _id, скажем n, тогда n + 1 будет индексом документа на основе _id.

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

Это также будет действительным, если документы будут удалены из коллекции.

Ответ 2

Насколько я знаю, для этого нет единой команды, и это невозможно в общем случае (см. ответ Derick). Однако использование 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, но count() должен быть доступен во всех папках драйверов.

Ответ 3

Нельзя сказать, что MongoDB может вернуть это, так как он не хранит документы в базе данных точно так же, как MySQL f.e. не содержит номера строк.

Трюк ObjectID от jhonkola будет работать только, если только один клиент создает новые элементы, так как ObjectID генерируются на стороне клиента, причем первая часть является меткой времени. Гарантийного поручения нет, если разные клиенты говорят на одном сервере. Тем не менее, я бы не стал полагаться на это.

Я также не совсем понимаю, что вы пытаетесь сделать, так что, возможно, упомяните об этом в своем вопросе? Затем я могу обновить ответ.

Ответ 4

Это может быть очень медленный, но простой метод. Здесь вы можете передать обычный запрос. Просто я перебираю все документы и проверяю, соответствует ли условие записи. Здесь я проверяю поле _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;
  }
});

Ответ 5

Перестройте свою коллекцию, чтобы включить позицию любой записи, то есть {'id': 12340, 'name': 'G', 'position': 1}, затем при поиске в коллекции базы данных (myCollection), используя нужную позицию в качестве запроса