搜索MongoDB中的嵌入式集合

时间:2017-03-27 07:40:57

标签: php mongodb laravel moloquent

我目前正在开发一个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本身或者通过“原始”PHP?

感谢。

1 个答案:

答案 0 :(得分:1)

如果您使用EmbedsMany关系,则可以获得至少拥有1个匹配令牌的所有用户:

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