Począwszy od wersji MongoDB 3.4 możemy nam e operator $indexOfArray
, aby zwrócić indeks, w którym dany element można znaleźć w tablicy.
$indexOfArray
ma trzy argumenty. Pierwsza to nazwa pola tablicy poprzedzonego znakiem $
.
Drugi element to element, a trzeci opcjonalny to indeks do rozpoczęcia wyszukiwania. $indexOfArray
zwraca pierwszy indeks, w którym element zostanie znaleziony, jeśli nie podano indeksu, aby rozpocząć wyszukiwanie.
Demo:
> db.collection.insertOne({ "_id" : 123, "food": [ "apple", "mango", "banana", "mango" ] })
{ "acknowledged" : true, "insertedId" : 123 }
> db.collection.aggregate([ { "$project": { "matchedIndex": { "$indexOfArray": [ "$food", "mango" ] } } } ])
{ "_id" : 123, "matchedIndex" : 1 }
> db.collection.aggregate([ { "$project": { "matchedIndex": { "$indexOfArray": [ "$food", "mango", 2 ] } } } ])
{ "_id" : 123, "matchedIndex" : 3 }
> db.collection.aggregate([ { "$project": { "matchedIndex": { "$indexOfArray": [ "$food", "apricot" ] } } } ] )
{ "_id" : 123, "matchedIndex" : -1 }
Ta odpowiedź jest najlepsza dla wersji 3.4+, ale jeśli używasz starej wersji, powinna nastąpić odpowiedź @BlakesSeven –