在 MongoDB 中搜索嵌入式集合
Search through embedded collections in MongoDB
我目前正在开发一个 PHP (laravel) 项目,我们正在使用 MongoDB(jenssegers 包)。我根据以下结构重置了密码:
{
"_id" : ObjectId("58d56135b462e816642abbd1"),
"email" : "wesley@foo.bar",
"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
。所以,当我想搜索令牌时,我希望能够搜索所有重置而不是这样做:
$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
本身或者可能通过 "raw" PHP?
谢谢。
如果您使用 EmbedsMany 关系,您可以获得至少具有 1 个匹配令牌的所有用户:
User::where('passwordReset', 'elemMatch', array('token' => $this->route('token')));
我目前正在开发一个 PHP (laravel) 项目,我们正在使用 MongoDB(jenssegers 包)。我根据以下结构重置了密码:
{
"_id" : ObjectId("58d56135b462e816642abbd1"),
"email" : "wesley@foo.bar",
"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
。所以,当我想搜索令牌时,我希望能够搜索所有重置而不是这样做:
$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
本身或者可能通过 "raw" PHP?
谢谢。
如果您使用 EmbedsMany 关系,您可以获得至少具有 1 个匹配令牌的所有用户:
User::where('passwordReset', 'elemMatch', array('token' => $this->route('token')));