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

วิธีค้นหาเอกสารผ่านอาร์เรย์ตัวเลข (Integer Array) ใน MongoDB

บทความนี้สาธิต 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}}