Поиск по встроенным коллекциям в MongoDB

В настоящее время я работаю над проектом PHP (laravel), где мы используем MongoDB (пакет jenssegers). Я сделал сброс пароля на следующую структуру:

{
"_id" : ObjectId("58d56135b462e816642abbd1"),
"email" : "[email protected]",
"updated_at" : ISODate("2017-03-26T20:46:14.074Z"),
"created_at" : ISODate("2017-03-24T18:11:01.040Z"),
"passwordReset" : [
{
"token" : "59b4b694e9ddcd9b44b0374eac595b28",
"updated_at" : ISODate("2017-03-24T18:11:05.017Z"),
"created_at" : ISODate("2017-03-24T18:11:05.017Z"),
"_id" : ObjectId("58d56139b462e816642abbd4")
}
]
}

Тем не менее, несколько пользователей могут иметь несколько passwordReset«S. Поэтому, когда я хочу искать токены, я хотел бы просто иметь возможность искать все сбросы вместо того, чтобы делать это:

    $users = User::all();
$activeReset = null;
foreach ($users as $user) {
if (! is_null($user->passwordReset)) {
foreach ($user->passwordReset as $reset) {
if ($reset->token == $this->route('token')) {
$activeReset = $reset;
}
}
}
}

Это рабочее решение, но оно не самое красивое, также, когда приложение запускается в производство, это приведет к огромному времени загрузки, а это не то, что я ищу.

Тем не менее, просто все сбрасывает через PasswordReset::all(); приводит к пустому массиву.

Итак, есть ли способ сделать это, не проходя через всех пользователей? Через Laravel сам или может через «сырой» PHP?

Благодарю.

0

Решение

Вы можете получить всех пользователей, у которых есть хотя бы один соответствующий токен, если вы используете EmbedsMany отношение:

User::where('passwordReset', 'elemMatch', array('token' => $this->route('token')));
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]