Как найти документ по его позиции/индексу в массиве?

Мне нужно получить, скажем, документы в позициях 1,5 и 8 в базе данных MongoDB с помощью Mongoose. Можно ли вообще получить документ по его положению в коллекции? Если да, то не могли бы вы показать, как это сделать?

Мне нужно что-то вроде этого:

var someDocs = MyModel.find({<collectionIndex>: [1, 5, 8]}, function(err, docs) {

    //do something with the three documents

})

Я попытался сделать следующее, чтобы узнать, какие индексы используются в коллекции, но получаю сообщение об ошибке «getIndexes не является функцией»:

var indexes = MyModel.getIndexes();

Цените любую помощь.


person Octtavius    schedule 07.02.2017    source источник


Ответы (2)


Если, например, под позицией 5 вы подразумеваете буквальный 5-й элемент в вашей коллекции, это не лучший способ. Коллекция Mongo обычно находится в том порядке, в котором вы вставили элементы, но это может быть не всегда. Посмотрите ответ здесь и проверьте документы на natural order: https://stackoverflow.com/a/33018164/7531267.

В вашем случае у вас может быть уникальный id для каждой записи, по которой вы можете запрашивать. Предполагая, что [1, 5, 8], которые вы упомянули, являются id, это должно сделать что-то вроде этого:

var someDocs = MyModel.find({ $or: [{ id: 1 }, { id: 5 }, { id: 8 }]}}, function(err, cb) {
    //do something with the three documents
})

Вы также можете прочитать о $in, чтобы заменить $or и немного очистить запрос.

person Justin Hellreich    schedule 07.02.2017
comment
Дело в том, что мне нужно получить 3 случайных документа из коллекции с помощью Mongoose. Итак, я хотел сделать это, сгенерировав 3 случайных числа и получив документы, используя эти числа в качестве индекса в коллекции. Итак, если бы моя функция сгенерировала числа 1, 5 и 8, я хотел бы использовать эти числа. Я знаю, что есть функция монго для получения случайных документов, но мне нужно сделать это в мангусте. - person Octtavius; 10.02.2017
comment
Ааа, очень интересная задачка. Возможно, что-то вроде это может помочь. Суть в следующем: Model.findOne().skip(random), хотя вам потребуется три запроса, чтобы получить три случайных записи. - person Justin Hellreich; 10.02.2017

Предположим, у вас есть этот документ в коллекциях пользователей:

{
  _id: ObjectId('...'),
  name: 'wrq',
  friends: ['A', 'B', 'C']
}

Код ниже для поиска первого и третьего друга пользователя 'wrq':

db.users.aggregate(
  [
    {
      $match: {
        name: 'wrq'
      }
    },
    {
      $project:{
        friend1: {
          $arrayElemAt: ["$friends", 0]
        },
        friend3: {
          $arrayElemAt: ["$friends", 2]
        }
      }
    }
  ]
)
person 王如锵    schedule 08.02.2017
comment
Этот код хорошо работает в оболочке mongo, вам может понадобиться найти, как это сделать с помощью mongoose. - person 王如锵; 08.02.2017