Конечно, с ростом числа идентификаторов, которые вы используете в запросе $in
, будет все больше проблем. Мы испытали значительное увеличение времени выполнения запросов с массивами из нескольких тысяч идентификаторов.
Вы можете увидеть, сколько документов сканируется во время выполнения вашего запроса, используя функцию объяснение () в оболочке MongoDB (или используя упакованные запросы):
{"$query" : {"foo" : "bar"}, "$explain" : true}
Количество отсканированных документов должно быть как можно ближе к числу возвращенных документов.
Просто общее примечание, которое может быть полезно для других - иногда вам вообще не нужен запрос $in
. Если вы измените отношение один ко многим, вы можете упростить запрос. Например, если вы хотите найти песни, которые понравились пользователю, вместо того, чтобы иметь следующую структуру:
user :
{
'likes' : [
ObjectId(song_id1),
ObjectId(song_id2),
...
]
}
Вы можете иметь:
song :
{
'likedBy' : [
ObjectId(user_id1),
ObjectId(user_id2),
...
]
}
тогда вы можете просто запросить песни, для которых {'likedBy' : ObjectId(yourUserId)}
(MongoDB будет искать идентификатор в массиве). Конечно, это зависит от ситуации, и этот пример тривиален, но иногда вы можете значительно ускорить запрос, изменив отношение и, возможно, добавив некоторую избыточность данных.