在 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')));