У меня есть коллекция song_test, в которой есть поле "artist_name". Я создал хешированный индекс на том же.
> db.songs_test.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "songs_new.songs_test"
},
{
"v" : 2,
"key" : {
"artist_name" : "hashed"
},
"name" : "artist_name_hashed",
"ns" : "songs_new.songs_test"
}
]
Затем я запускаю следующий запрос агрегации:
use songs_new
db.songs_test.explain().aggregate([
{$lookup : {
"from": "songs_test",
"localField": "artist_name",
"foreignField": "artist_name",
"as": "artist_name_matches"
}
},
{$unwind : "$artist_name_matches"}
], {allowDiskUse: true}
)
Для выполнения этого запроса агрегации требуется около 13 минут. Коллекция Songs_test насчитывает 1 миллион записей. Когда я делаю объяснение - я вижу, что поиск не использует индекс.
Объясните вывод:
switched to db songs_new
{
"stages" : [
{
"$cursor" : {
"query" : {
},
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "songs_new.songs_test",
"indexFilterSet" : false,
"parsedQuery" : {
},
"queryHash" : "8B3D4AB8",
"planCacheKey" : "8B3D4AB8",
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
}
},
{
"$lookup" : {
"from" : "songs_test",
"as" : "artist_name_matches",
"localField" : "artist_name",
"foreignField" : "artist_name",
"unwinding" : {
"preserveNullAndEmptyArrays" : false
}
}
}
],
"ok" : 1
}
Я пробовал разные вещи (предложенные в Интернете), но не смогузнать точную причину. Кроме того, требуется около 13 минут для работы на 8-разрядной 64-ГБ оперативной памяти. Совокупный запрос использует только один поток (что также странно). Может кто-нибудь помочь, почему он не использует индекс и почему агрегация выполняется в одном потоке?