Общий выпуск
Допустим, у нас есть пользователи в нашей системе, и у каждого пользователя есть ТОЧНО одна команда.
Теперь в системе есть возможность поиска команд по имени пользователя, фамилии и имени команды.
Такой поиск должен быть хорошо проиндексирован, потому что он не должен использовать каждый баран на сервере.
Визуальные объекты
class User
{
public ObjectId Id;
public string FirstName;
public string LastName;
}
class Team
{
public ObjectId Id;
public ObjectId UserId;
public string Name;
}
Эквивалент SQL
SELECT
Id,
UserId
FROM
Teams
LEFT OUTER JOIN Users ON Users.Id = Teams.UserId
WHERE
Users.FirstName LIKE "%someting%"
OR Users.LastName LIKE "%someting%"
OR Teams.Name LIKE "%someting%"
Что у меня сейчас
db.getCollection('Teams').aggregate([
{$lookup:
{
from: "Users",
localField: "UserId",
foreignField: "Id",
as: "user"
}},
{$match : {$or : [{Name : /somename/}, {"user.0.FirstName": /somename/}, {"user.0.LastName" : /somename/}]}}
Задача
Работает, но ...
Я не могу понять, как мне нужно индексировать вещи или что-то менять, чтобы запрос использовал индексы.
Не похоже, что индексация соответствующих полей Команды или Пользователя помогает.