ในพังพอนฉันจะเรียงลำดับตามวันที่ได้อย่างไร (Node.js)


161

สมมติว่าฉันเรียกใช้แบบสอบถามนี้ใน Mongoose:

Room.find({}, function(err,docs){

}).sort({date:-1}); 

มันใช้งานไม่ได้!

คำตอบ:


429

การเรียงลำดับในพังพอนมีการพัฒนามากกว่าการเผยแพร่ดังกล่าวว่าบางคำตอบเหล่านี้จะไม่ถูกต้องอีกต่อไป จากการปล่อย Mongoose 4.1.xการเรียงลำดับจากมากไปน้อยในdateฟิลด์สามารถทำได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้:

Room.find({}).sort('-date').exec(function(err, docs) { ... });
Room.find({}).sort({date: -1}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'desc'}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'descending'}).exec(function(err, docs) { ... });
Room.find({}).sort([['date', -1]]).exec(function(err, docs) { ... });
Room.find({}, null, {sort: '-date'}, function(err, docs) { ... });
Room.find({}, null, {sort: {date: -1}}, function(err, docs) { ... });

สำหรับการจัดเรียงจากน้อยไปมากละเว้น-คำนำหน้าในรุ่นสตริงหรือใช้ค่าของ1, หรือascascending


1
+1 สำหรับการแสดงวิธีต่าง ๆ ที่สามารถทำได้มากมาย อย่างไรก็ตามฉันไม่พบเอกสารที่Query # find ในอาร์กิวเมนต์จำนวนมาก Query#find([criteria], [callback])ลายเซ็นคือ ฉันคิดว่าอาจมีการจับมือลับบางอย่างที่ระบุว่า "เกณฑ์" อาจมีได้ถึงสามข้อโต้แย้ง แต่มันแสดงประเภทเป็น "วัตถุ"
Nateowami

@Nateowami คุณกำลังดูfindวิธีที่ผิดในเอกสาร Model.findดู
JohnnyHK

1
คุณถูก. ผมเห็นพวกเขากำลังใช้สัญกรณ์และค้นหาModule#property #findดูเหมือนว่าไม่มีวิธีที่ง่ายในการนำทางหรือค้นหาเอกสาร การค้นหาพบผลตอบแทน 187 ผลลัพธ์
Nateowami

2
คุณสามารถเรียงลำดับตาม_idฟิลด์ ตัวอย่างเช่นในการรับข้อมูลล่าสุดคุณสามารถทำได้:await db.collection.findOne().sort({ _id: -1 });
Mike K

53

คำตอบที่ถูกต้องคือ:

Blah.find({}).sort({date: -1}).execFind(function(err,docs){

});

13
ไวยากรณ์การเรียงลำดับที่อัปเดตสำหรับตัวอย่างด้านบนคือ: sort ('- date') mongoosejs.com/docs/api.html#query_Query-sort
emilebaizel

3
อันนี้ไม่ได้ผลสำหรับฉัน ฉันได้รับข้อผิดพลาด "User.find (... ). sort (... ). execFind ไม่ใช่ฟังก์ชั่น"
Sandip Subedi

12

รับการจัดการกับปัญหานี้ในวันนี้โดยใช้ Mongoose 3.5 (.2) และไม่มีคำตอบที่ช่วยฉันแก้ปัญหานี้ ข้อมูลโค้ดต่อไปนี้ทำการหลอกลวง

Post.find().sort('-posted').find(function (err, posts) {
    // user posts array
});

คุณสามารถส่งพารามิเตอร์มาตรฐานใด ๆ ที่คุณต้องการfind()(เช่นที่คำสั่งและฟิลด์คืน) แต่ไม่มีการโทรกลับ โดยไม่ต้องโทรกลับก็จะส่งกลับวัตถุแบบสอบถามที่คุณโซ่sort()บน คุณต้องโทรfind()อีกครั้ง (โดยมีหรือไม่มีพารามิเตอร์เพิ่มเติม - ไม่จำเป็นต้องมีเหตุผลด้านประสิทธิภาพ) ซึ่งจะช่วยให้คุณได้รับผลการตั้งค่าในการติดต่อกลับของคุณ


4

ฉันทำนี่:

Data.find( { $query: { user: req.user }, $orderby: { dateAdded: -1 } } function ( results ) {
    ...
})

สิ่งนี้จะแสดงสิ่งล่าสุดก่อน


1
$orderbyเลิกใช้แล้วใน MongoDB 3.2 ดังนั้นจึงไม่ควรใช้อีกต่อไป
JohnnyHK

4
Post.find().sort({date:-1}, function(err, posts){
});

ควรทำงานเช่นกัน

แก้ไข:

คุณสามารถลองใช้สิ่งนี้หากคุณได้รับข้อผิดพลาดsort() only takes 1 Argument:

Post.find({}, {
    '_id': 0,    // select keys to return here
}, {sort: '-date'}, function(err, posts) {
    // use it here
});

1
สิ่งนี้ทำให้ฉันเกิดข้อผิดพลาด:Error: sort() only takes 1 Argument
mrid

@LukeXF โปรดดูคำตอบที่อัพเดต ฉันหวังว่ามันจะช่วยให้คุณ :)
mrid

@ น้อยก็ควรจะเป็นเช่น: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi

2

วิธีแก้ปัญหาสั้น ๆ :

const query = {}
const projection = {}
const options = { sort: { id: 1 }, limit: 2, skip: 10 }

Room.find(query, projection, options).exec(function(err, docs) { ... });

1

ดูว่าสิ่งนี้จะช่วยให้> วิธีการเรียงลำดับพังพอน?

โปรดอ่านข้อมูลนี้> http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order


วิธีแรกนั้นไม่ทำงาน มันแค่แฮงค์ ... ฉันคิดว่ามันเป็นเพราะการอัพเดทในพังพอน .... และวิธีที่สองเป็นเพียงแค่เอกสาร Mongo ซึ่งฉันรู้
TIMEX

ฟังก์ชัน find () เป็นฟังก์ชันของ MongoDB ไม่ใช่ Mongoose โปรดอ่านหน้า Mongoose API สำหรับรายละเอียดเพิ่มเติมคุณสามารถใช้ไวยากรณ์ที่กำหนดในเอกสาร MongoDB กับ Mongoose นั่นเป็นเหตุผลที่พังพอนไม่ได้มีการเรียงลำดับหรือตัดกันแบบสอบถาม
neebz

0

คุณสามารถเรียงลำดับตาม_idฟิลด์ ตัวอย่างเช่นหากต้องการรับระเบียนล่าสุดคุณสามารถทำได้

const mostRecentRecord = await db.collection.findOne().sort({ _id: -1 });

มันเร็วกว่ามากด้วยเพราะฉันยินดีมากกว่าที่จะเดิมพันว่าdateฟิลด์ของคุณไม่ได้รับการจัดทำดัชนี

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