MongoDB में एक सरणी में मानों को दूसरी सरणी में खोजने और मिलान वाले इंडेक्स (या -1 यदि नहीं मिला) वाली सरणी लौटाने के लिए, $map के साथ $indexOfArray का उपयोग करें।
उदाहरण: मान सरणी वाले दस्तावेज़
> db.demo381.insertOne({"Values":[10,40,60,30,60]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5b59f72ae06a1609a00b15") }
> db.demo381.insertOne({"Values":[100,500,700,500,800]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5b59f72ae06a1609a00b16") }
> db.demo381.insertOne({"Values":[20,40,30,10,60]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5b59f72ae06a1609a00b17") }
दस्तावेज़ देखना
> db.demo381.find();
आउटपुट: तीन दस्तावेज़ जिनमें अलग-अलग पूर्णांक सरणी हैं।
एग्रीगेशन: खोज मान [10, 40] के इंडेक्स ढूंढें
> 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 ] }
व्याख्या
$mapखोज सरणी[10, 40]पर पुनरावृत्त करता है।$indexOfArrayप्रत्येक खोज मान के लिएValuesसरणी में पहला इंडेक्स लौटाता है (नहीं मिला तो -1)।- परिणाम खोज सरणी के अनुरूप इंडेक्स की सरणी है।
वैकल्पिक: सभी घटनाएं (सभी इंडेक्स)
$indexOfArray केवल पहला इंडेक्स लौटाता है। सभी इंडेक्स के लिए, $filter के साथ $range/$map का उपयोग करें:
> db.demo381.aggregate([
{ $project: {
Result: {
$map: {
input: [10, 40],
in: {
$filter: {
input: { $range: [ 0, { $size: "$Values" } ] },
cond: { $eq: [ { $arrayElemAt: [ "$Values", "$$this" ] }, "$$this" ] }
}
}
}
}
}}
]);
यह अधिक जटिल है; एप्लिकेशन कोड में करने पर विचार करें।