จะจัดเรียงคอลเลกชันตามวันที่ใน MongoDB ได้อย่างไร?


125

ฉันใช้ MongoDB กับ Node.JS. ฉันมีคอลเล็กชันที่มีวันที่และแถวอื่น ๆ วันที่เป็นDateวัตถุJavaScript

ฉันจะจัดเรียงคอลเลคชันนี้ตามวันที่ได้อย่างไร?


1
ง่าย collection.find (). sort ({datefield: 1}, function (err, cursor) {... }); หรือคุณยังสามารถใช้ collection.find (). sort ({datefield: -1}, function (err, cursor) {... });
Atul Jain

โปรดทราบว่าคุณอาจไม่จำเป็นต้องใช้dateคอลัมน์: stackoverflow.com/questions/5125521/…
phil294

คำตอบ:


190

เพียงแค่ปรับเปลี่ยนคำตอบของ @JohnnyHK เล็กน้อย

collection.find().sort({datefield: -1}, function(err, cursor){...});

ในหลายกรณีการใช้งานเราต้องการให้มีการส่งคืนบันทึกล่าสุด (เช่นการอัปเดต / ส่วนแทรกล่าสุด)


1
คุณตั้งใจจะใส่ฟังก์ชั่นอะไร? แค่พยายามจัดเรียงDateวัตถุที่ไม่มีฟังก์ชันไม่ได้ผลสำหรับฉันใน 2.6.3
Sam Brightman

@SamBrightman ฟังก์ชั่นนั้นเป็นเพียงการโทรกลับ ไม่ว่าคุณต้องการทำอะไรกับผลลัพธ์การสืบค้นคุณใส่ตรรกะนั้นไว้ในการเรียกกลับของคุณ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการโทรกลับคืออะไรและวิธีการทำงานเพื่อเรียนรู้การเขียนโปรแกรมตามเหตุการณ์
Sushant Gupta

แน่นอนฉันรู้ว่าการโทรกลับคืออะไร ฉันเห็นเฉพาะข้อกำหนดการจัดเรียงในคำถามและคำตอบทั้งหมดจะให้การติดต่อกลับ ในขณะเดียวกันการเรียงลำดับก็ไม่ได้ผลสำหรับฉันดังนั้นฉันคิดว่าบางทีคุณอาจต้องทำงานเพิ่มเติมในฟังก์ชันนี้
Sam Brightman

1
@SamBrightman โอเค เพื่อความสะดวกคุณสามารถชัดเจนและโซ่เช่นcollection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta

5
มันบอกว่า sort () ใช้เวลาเพียง 1 Argument
Jitendra Pancholi

39

การจัดเรียงตามวันที่ไม่จำเป็นต้องมีอะไรพิเศษ เพียงจัดเรียงตามช่องวันที่ที่ต้องการของคอลเลกชัน

อัปเดตสำหรับไดรเวอร์เนทีฟ 1.4.28 node.js คุณสามารถเรียงลำดับจากน้อยไปหามากdatefieldโดยใช้วิธีใด ๆ ต่อไปนี้:

collection.find().sort({datefield: 1}).toArray(function(err, docs) {...});
collection.find().sort('datefield', 1).toArray(function(err, docs) {...});
collection.find().sort([['datefield', 1]]).toArray(function(err, docs) {...});
collection.find({}, {sort: {datefield: 1}}).toArray(function(err, docs) {...});
collection.find({}, {sort: [['datefield', 1]]}).toArray(function(err, docs) {...});

'asc'หรือ'ascending'สามารถใช้แทนไฟล์1.

การเรียงลำดับจากมากไปน้อยใช้'desc', 'descending'หรือในสถานที่ของ-11


ฉันกำลังใช้โซลูชันข้างต้นในช่องชื่อผู้ใช้มันใช้งานได้ดี แต่คำนึงถึงตัวพิมพ์เล็กและใหญ่จะเพิกเฉยได้อย่างไร
Rahul Matte

คำตอบที่ถูกต้องด้วยหลายทาง (y)
abdulbarik


16

คำตอบของ Sushant Gupta ค่อนข้างล้าสมัยและใช้ไม่ได้อีกต่อไป

ตัวอย่างต่อไปนี้ควรเป็นแบบนี้ในตอนนี้:

collection.find({}, {"sort" : ['datefield', 'asc']} ).toArray(function(err,docs) {});


@JohnnyHK หวาน. ฉันจำสถานการณ์ที่แน่นอนไม่ได้ แต่เมื่อฤดูร้อนที่แล้วฉันพยายามทำให้การเรียงลำดับทำงานกับตัวอย่างข้อมูลของ Sushant และมันก็ไม่ได้ผลสำหรับฉัน บางทีอาจเป็นเพราะมันขาดtoArrayส่วน
krikara

นี่เป็นคำตอบที่ผิด แต่ให้ผลลัพธ์ผิดใน node.js
David A

12

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

collection.find({}, {"sort" : [['datefield', 'asc']]}, function (err, docs) { ... });

การใช้ Node.js, Express.js และ Monk



5

พังพอนมันง่ายเหมือน:

collection.find().sort('-date').exec(function(err, collectionItems) {
  // here's your code
})

4

สแควร์เพิ่มเติม[]วงเล็บเป็นสิ่งจำเป็นสำหรับการเรียงลำดับพารามิเตอร์ในการทำงาน

collection.find({}, {"sort" : [['datefield', 'asc']]} ).toArray(function(err,docs) {});

2

หากรูปแบบวันที่ของคุณเป็นเช่นนี้: 14/02/1989 ----> คุณอาจพบปัญหาบางอย่าง

คุณต้องใช้ ISOdate ดังนี้:

var start_date = new Date(2012, 07, x, x, x); 

-----> ผลลัพธ์ ------> ISODate ("2012-07-14T08: 14: 00.201Z")

ตอนนี้ใช้แบบสอบถามดังนี้:

 collection.find( { query : query ,$orderby :{start_date : -1}} ,function (err, cursor) {...}

แค่นั้นแหละ :)


2

ด้วยพังพอนฉันไม่สามารถใช้ 'toArray' และได้รับข้อผิดพลาด: TypeError: Collection.find(...).sort(...).toArray is not a function. ฟังก์ชัน toArray มีอยู่ในคลาส Cursor จาก Native MongoDB NodeJS driver ( การอ้างอิง )

นอกจากนี้ sort ยอมรับพารามิเตอร์เพียงตัวเดียวดังนั้นคุณจึงไม่สามารถส่งผ่านฟังก์ชันของคุณเข้าไปข้างในได้

สิ่งนี้ใช้ได้ผลสำหรับฉัน (ตามคำตอบของEmil ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.