Как мне ограничить количество возвращаемых товаров?

113
myModel.find({}, function(err, items) {
    console.log(items.length);    // Big number
});

Как я могу ограничить возвращаемые элементы только последними 10 элементами, которые были вставлены?

Бегущая черепаха
источник

Ответы:

189

В последней версии mongoose (3.8.1 на момент написания) вы делаете две вещи по-разному: (1) вам нужно передать один аргумент в sort (), который должен быть массивом ограничений или только одним ограничением, и (2 ) execFind () удален и заменен на exec (). Следовательно, с мангустом 3.8.1 вы сделаете это:

var q = models.Post.find({published: true}).sort({'date': -1}).limit(20);
q.exec(function(err, posts) {
     // `posts` will be of length 20
});

или вы можете связать их вместе просто так:

models.Post
  .find({published: true})
  .sort({'date': -1})
  .limit(20)
  .exec(function(err, posts) {
       // `posts` will be of length 20
  });
Marni
источник
что означает {'date': -1}? Заранее спасибо!
kurumkan
3
@ArslArsl - результаты будут отсортированы по дате в порядке убывания.
NL Long
@ArslArsl это похоже на следующее: { date: 'desc' } {date: 'descending'}. Смотрите этот ответ
rotimi-best
Есть ли максимальный предел?
lukas_o
20

Вот так, используя .limit ():

var q = models.Post.find({published: true}).sort('date', -1).limit(20);
q.execFind(function(err, posts) {
  // `posts` will be of length 20
});
kcbanner
источник
2
Большое спасибо, не знал, что можно делать такие запросы. Где я могу найти документацию по этому методу execFind?
Running Turtle
Честно говоря, я просто смотрю примеры в исходниках мангуста и тому подобное, а также на тестовые примеры. Список рассылки тоже хорош. Фактические документы кажутся немного устаревшими.
kcbanner
1
execFind все еще в последней версии mongoosejs?
Мэнни
2
@ Manny Это не так. См. Ответ Марни для получения обновленной версии.
JohnnyHK
15

Я немного ленив, поэтому люблю простые вещи:

let users = await Users.find({}, null, {limit: 50});
код
источник
8
models.Post.find({published: true}, {sort: {'date': -1}, limit: 20}, function(err, posts) {
 // `posts` with sorted length of 20
});
Сухаил Ахмед
источник
5
Хотя этот фрагмент кода может решить вопрос, в том числе объяснение того, как и почему это решает проблему , действительно поможет улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас! Пожалуйста , измените свой ответ , чтобы добавить объяснение, и дать указание о том , что применять ограничения и допущения.
Тоби Спейт
2

Найти параметры

Функция find принимает следующие параметры:

  1. условия «Object».
  2. [projection] «Object|String»необязательные поля для возврата, см. Query.prototype.select ()
  3. [параметры] «Object»необязательно см. Query.prototype.setOptions ()
  4. [Перезвони] «Function»

Как ограничить

const Post = require('./models/Post');

Post.find(
  { published: true }, 
  null, 
  { sort: { 'date': 'asc' }, limit: 20 },
  function(error, posts) {
   if (error) return `${error} while finding from post collection`;

   return posts; // posts with sorted length of 20
  }
);

Дополнительная информация

Mongoose позволяет вам запрашивать ваши коллекции разными способами, например: Официальная документация

// named john and at least 18
MyModel.find({ name: 'john', age: { $gte: 18 }});

// executes, passing results to callback
MyModel.find({ name: 'john', age: { $gte: 18 }}, function (err, docs) {});

// executes, name LIKE john and only selecting the "name" and "friends" fields
MyModel.find({ name: /john/i }, 'name friends', function (err, docs) { })

// passing options
MyModel.find({ name: /john/i }, null, { skip: 10 })

// passing options and executes
MyModel.find({ name: /john/i }, null, { skip: 10 }, function (err, docs) {});

// executing a query explicitly
var query = MyModel.find({ name: /john/i }, null, { skip: 10 })
query.exec(function (err, docs) {});

// using the promise returned from executing a query
var query = MyModel.find({ name: /john/i }, null, { skip: 10 });
var promise = query.exec();
promise.addBack(function (err, docs) {});
Rotimi лучший
источник
1

По какой-то причине я не мог заставить это работать с предложенными ответами, но я нашел другой вариант, используя select, который сработал для меня:

models.Post.find().sort('-date').limit(10).select('published').exec(function(e, data){
        ...
});

Возможно, изменился api? Я использую версию 3.8.19

TGH
источник
1

... дополнительно обязательно используйте:

mongoose.Promise = Promise;

Это ставит обещание мангуста на исходное обещание ES6. Без этого дополнения я получил:

DeprecationWarning: Mongoose: mpromise (библиотека обещаний mongoose по умолчанию) устарела, вместо этого подключите свою собственную библиотеку обещаний: http://mongoosejs.com/docs/promises.html

Шмалитц
источник