ใช้ $map ร่วม $indexOfArray เพื่อวนลูปค่าที่ต้องการค้นหา และหาตำแหน่ง (index) ในอาร์เรย์เป้าหมาย
ตัวอย่างข้อมูลทดสอบ
> db.demo381.insertOne({"Values":[10,40,60,30,60]});
> db.demo381.insertOne({"Values":[100,500,700,500,800]});
> db.demo381.insertOne({"Values":[20,40,30,10,60]});
แสดงข้อมูล
> db.demo381.find();
{
"_id" : ObjectId("5e5b59f72ae06a1609a00b15"), "Values" : [10, 40, 60, 30, 60]
}
{
"_id" : ObjectId("5e5b59f72ae06a1609a00b16"), "Values" : [100, 500, 700, 500, 800]
}
{
"_id" : ObjectId("5e5b59f72ae06a1609a00b17"), "Values" : [20, 40, 30, 10, 60]
}
คำสั่ง Aggregation ค้นหา index ของ 10 และ 40 ใน Values
> db.demo381.aggregate([
{"$project":{
"Result":{
"$map":{
"input":[10,40],
"in":{"$indexOfArray":["$Values","$$this"]}
}
}
}}
])
ผลลัพธ์
{ "_id" : ObjectId("5e5b59f72ae06a1609a00b15"), "Result" : [0, 1] }
{ "_id" : ObjectId("5e5b59f72ae06a1609a00b16"), "Result" : [-1, -1] }
{ "_id" : ObjectId("5e5b59f72ae06a1609a00b17"), "Result" : [3, 1] }
คำอธิบาย:
- เอกสารที่ 1: 10 อยู่ index 0, 40 อยู่ index 1
- เอกสารที่ 2: ไม่มี 10 และ 40 คืน -1 ทั้งคู่
- เอกสารที่ 3: 10 อยู่ index 3, 40 อยู่ index 1
$indexOfArrayคืน index แรกที่พบ (first occurrence)