Запрос Mongodb использует функцию пропуска и ограничения в первых N документах - PullRequest
0 голосов
/ 25 мая 2019

Можем ли мы сделать запрос, который позволит нам использовать пропуск и ограничение в первых N документах?

Пример:

Предположим, что в коллекции почти 500 документов, называемых учителями.

Я хочу запрос, ограничивающий чтение только первых 300 документов.

Если я использую skip (300) в этом запросе, он должен отобразить ноль.

db.teachers.find().pretty()

{
  id : 1,
  name : "teach001"
},
{
  id : 2,
  name : "teach002"
},
{
  id : 3,
  name : "teach003"
},
{
  id : 4,
  name : "teach004"
},
{
  id : 5,
  name : "teach005"
},
{
  id : 6,
  name : "teach006"
},
{
  id : 7,
  name : "teach007"
},
{
  id : 8,
  name : "teach008"
},
{
  id : 9,
  name : "teach009"
},
{
  id : 10,
  name : "teach0010"
}



 db.teachers.find({some query here to restrict access first 5 documents only }).skip(5).limit(5).pretty()

1 Ответ

0 голосов
/ 26 мая 2019

Агрегация

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

db.teachers.aggregate([{$limit: 5}, {$skip: 5}])

Просмотр

Если вы открыты для создания view , вы даже можете создать представление с принудительным ограничением

db.createView('limitedTeachers', 'teachers', [{$limit: 5}])

Тогда вы можете использовать find в представлении:

db.limitedTeachers.find({}).skip(5)

Два поиска

Если вы не можете использовать агрегацию, у вас есть возможность использовать 2 поиска в вашем запросе.Сначала найдите n номеров идентификаторов объектов.Затем ограничьте свой второй запрос только этими идентификаторами объектов.

var ids = [];
db.teachers.find({}, {_id: 1}).limit(5).forEach(function(doc){
    ids.push(doc._id);
});

db.teachers.find({ _id: {$in: ids} }).skip(5)

Или как запрос того же типа, но ближе к формату, который использовался в вашем вопросе

db.teachers.find({$or: db.teachers.find({}, {_id: 1}).limit(5).toArray()}).skip(5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...