ฉันจะ จำกัด จำนวนของที่ส่งคืนได้อย่างไร?


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

ฉันจะ จำกัด สินค้าที่ส่งคืนให้เหลือเพียง 10 รายการล่าสุดที่ใส่เข้าไปได้อย่างไร?

คำตอบ:


189

ในพังพอนล่าสุด (3.8.1 ในขณะที่เขียน) คุณทำสองสิ่งที่แตกต่างกัน: (1) คุณต้องส่งอาร์กิวเมนต์เดียวเพื่อเรียงลำดับ () ซึ่งต้องเป็นอาร์เรย์ของข้อ จำกัด หรือเพียงข้อ จำกัด เดียวและ (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
  });

{'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
});

2
ขอบคุณมากไม่รู้ว่าคุณจะตั้งคำถามแบบนั้นได้ ฉันจะหารูปแบบเอกสารเกี่ยวกับเมธอด execFind นี้ได้ที่ไหน
Running Turtle

จริงๆแล้วฉันแค่ดูตัวอย่างในแหล่งที่มาและสิ่งของพังพอนรวมถึงกรณีทดสอบ รายชื่อผู้รับจดหมายก็ดีเช่นกัน เอกสารจริงดูเหมือนจะล้าสมัยไปหน่อย
kcbanner

1
execFind ยังอยู่ใน mongoosejs เวอร์ชันล่าสุดหรือไม่
Manny

2
@ มันนี่ไม่ใช่. ดูคำตอบของ marni สำหรับเวอร์ชันที่อัปเดต
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
ในขณะที่ข้อมูลโค้ดนี้อาจแก้คำถามรวมทั้งคำอธิบายของวิธีการและเหตุผลแก้นี้ปัญหาจริงๆจะช่วยเหลือในการปรับปรุงคุณภาพของการโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่แค่คนที่ถามตอนนี้! โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้
Toby Speight

2

ค้นหาพารามิเตอร์

ฟังก์ชั่นค้นหาพารามิเตอร์มีดังนี้:

  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
  }
);

ข้อมูลเพิ่มเติม

พังพอนช่วยให้คุณค้นหาคอลเล็กชันของคุณในรูปแบบต่างๆเช่น: เอกสารอย่างเป็นทางการ

// 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) {});

1

ด้วยเหตุผลบางอย่างฉันไม่สามารถทำให้สิ่งนี้ทำงานกับคำตอบที่เสนอได้ แต่ฉันพบรูปแบบอื่นโดยใช้การเลือกที่เหมาะกับฉัน:

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

อาจมีการเปลี่ยนแปลง API หรือไม่? ฉันใช้เวอร์ชัน 3.8.19


1

... นอกจากนี้อย่าลืมใช้:

mongoose.Promise = Promise;

นี่เป็นการกำหนดสัญญาพังพอนตามสัญญา ES6 ดั้งเดิม หากไม่มีการเพิ่มนี้ฉันได้รับ:

คำเตือน: พังพอน: mpromise (ห้องสมุดสัญญาเริ่มต้นของพังพอน) เลิกใช้แล้วให้เสียบคลังสัญญาของคุณเองแทน: http://mongoosejs.com/docs/promises.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.