Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

จัดเรียง (Sort) ใน MongoDB เมื่อมีค่า null ด้วย sort()

เมื่อฟิลด์มีค่า null และต้องการจัดเรียง ให้ใช้ sort() (ตั้งแต่ MongoDB v3.2 $orderby ถูก deprecated)

> db.demo530.insertOne({"Name": "Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b2990ef4dcbee04fbbbec") }
> db.demo530.insertOne({"Name": null});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b2991ef4dcbee04fbbbed") }
> db.demo530.insertOne({"Name": "David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b2992ef4dcbee04fbbbee") }
> db.demo530.insertOne({"Name": "Adam"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b2995ef4dcbee04fbbbef") }
> db.demo530.insertOne({"Name": null});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b2999ef4dcbee04fbbbf0") }
> db.demo530.insertOne({"Name": "Carol"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b299eef4dcbee04fbbbf1") }

แสดงข้อมูล (ไม่ได้เรียง):

> db.demo530.find();
{ "_id" : ObjectId("5e8b2990ef4dcbee04fbbbec"), "Name" : "Chris" }
{ "_id" : ObjectId("5e8b2991ef4dcbee04fbbbed"), "Name" : null }
{ "_id" : ObjectId("5e8b2992ef4dcbee04fbbbee"), "Name" : "David" }
{ "_id" : ObjectId("5e8b2995ef4dcbee04fbbbef"), "Name" : "Adam" }
{ "_id" : ObjectId("5e8b2999ef4dcbee04fbbbf0"), "Name" : null }
{ "_id" : ObjectId("5e8b299eef4dcbee04fbbbf1"), "Name" : "Carol" }

คิวรี Aggregation เรียงตาม Name (null จะอยู่บนสุด)

> db.demo530.aggregate([
...   {$match: {"Name": {$exists: true}}},
...   {$sort: {"Name": 1}}
... ]);

ผลลัพธ์ - null อยู่ก่อน ตามด้วย A-Z:


ลำดับการจัดเรียงของ MongoDB (BSON Order)

  1. Null / Missing values
  2. Numbers (int, long, double)
  3. Strings
  4. Objects / Arrays
  5. Binary data
  6. ObjectId
  7. Boolean
  8. Date
  9. Timestamp
  10. Regular Expression

เคล็ดลับ: ใส่ null ไปท้ายสุด

ใช้ $sort ร่วมกับ $project สร้างฟิลด์ sort key:

{$project: {sortKey: {$cond: [{$eq: ["$Name", null]}, 1, 0]}, Name: 1}},
{$sort: {sortKey: 1, Name: 1}}

จะได้ลำดับ: Adam, Carol, Chris, David, null, null