บทความนี้สาธิต 2 กรณีการค้นหาเอกสารที่มีฟิลด์เป็นอาร์เรย์ตัวเลข: (1) ค้นหาเอกสารที่อาร์เรย์มีข้อมูลอย่างน้อย 1 ค่า (2) ค้นหาเอกสารที่อาร์เรย์มีค่าเฉพาะที่ต้องการ
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.searchDocumentArrayIntegerDemo.insertOne({"StudentFirstName":"John","StudentScores":[45,78,89,90]});
{ "acknowledged": true, "insertedId": ObjectId("5cd2a219345990cee87fd88c") }
> db.searchDocumentArrayIntegerDemo.insertOne({"StudentFirstName":"Larry","StudentScores":[45,43,34,33]});
{ "acknowledged": true, "insertedId": ObjectId("5cd2a22a345990cee87fd88d") }
> db.searchDocumentArrayIntegerDemo.insertOne({"StudentFirstName":"Chris","StudentScores":[]});
{ "acknowledged": true, "insertedId": ObjectId("5cd2a23c345990cee87fd88e") }
> db.searchDocumentArrayIntegerDemo.insertOne({"StudentFirstName":"David","StudentScores":[99]});
{ "acknowledged": true, "insertedId": ObjectId("5cd2a24d345990cee87fd88f") }
แสดงข้อมูลทั้งหมด
> db.searchDocumentArrayIntegerDemo.find().pretty();
ผลลัพธ์:
{
"_id": ObjectId("5cd2a219345990cee87fd88c"),
"StudentFirstName": "John",
"StudentScores": [45, 78, 89, 90]
}
{
"_id": ObjectId("5cd2a22a345990cee87fd88d"),
"StudentFirstName": "Larry",
"StudentScores": [45, 43, 34, 33]
}
{
"_id": ObjectId("5cd2a23c345990cee87fd88e"),
"StudentFirstName": "Chris",
"StudentScores": []
}
{
"_id": ObjectId("5cd2a24d345990cee87fd88f"),
"StudentFirstName": "David",
"StudentScores": [99]
}
กรณีที่ 1: ค้นหาเอกสารที่อาร์เรย์มีค่าอย่างน้อย 1 รายการ
ใช้ $where ตรวจสอบความยาวอาร์เรย์:
> db.searchDocumentArrayIntegerDemo.find({ $where: "this.StudentScores.length >= 1" } );
ผลลัพธ์ (ไม่นับ Chris ที่อาร์เรย์ว่าง):
{
"_id": ObjectId("5cd2a219345990cee87fd88c"),
"StudentFirstName": "John",
"StudentScores": [45, 78, 89, 90]
}
{
"_id": ObjectId("5cd2a22a345990cee87fd88d"),
"StudentFirstName": "Larry",
"StudentScores": [45, 43, 34, 33]
}
{
"_id": ObjectId("5cd2a24d345990cee87fd88f"),
"StudentFirstName": "David",
"StudentScores": [99]
}
กรณีที่ 2: ค้นหาเอกสารที่อาร์เรย์มีค่า 45 (ค่าที่ซ้ำในหลายเอกสาร)
ใช้ Query ปกติบนฟิลด์อาร์เรย์ (MongoDB จะจับคู่ทุก element ในอาร์เรย์):
> db.searchDocumentArrayIntegerDemo.find({StudentScores: 45}, {StudentScores:1});
ผลลัพธ์ (John และ Larry ที่มี 45 ในอาร์เรย์):
{
"_id": ObjectId("5cd2a219345990cee87fd88c"),
"StudentScores": [45, 78, 89, 90]
}
{
"_id": ObjectId("5cd2a22a345990cee87fd88d"),
"StudentScores": [45, 43, 34, 33]
}
เทคนิคเพิ่มเติม
- ใช้
$inเพื่อค้นหาหลายค่า:{StudentScores: {$in: [45, 99]}} - ใช้
$allเพื่อให้ต้องมีทุกค่าที่ระบุ:{StudentScores: {$all: [45, 78]}} - ใช้
$sizeเพื่อค้นหาอาร์เรย์ที่มีขนาดเท่ากับค่าที่กำหนด:{StudentScores: {$size: 4}}