User.findOne 在对象解构字符串键中循环

User.findOne is looping over in object destructuring string key

我正在参加在线课程,有一部分讲师说他正在尝试使用 User.findOne 查找/验证用户并通过一些条件来查找请求的用户。为了传递值,他使用了对象解构。具体代码如下:

const token = req.header("Authorization").replace("Bearer ", "");
const decoded = jwt.verify(token, "secret key here!"); 

// issue is here, look at the second property of the findOne function's argument.
const user=await User.findOne({_id: decoded._id, 'tokens.token': token})

讲师正在 'tokens.token' 中使用字符串键。他是说,mongodb 将遍历指定 user 对象中可用的所有标记,以检查给定的 token 是否匹配。

如果您想知道,这里有一个包含 auth 令牌的 user 示例:

  {
        "name": "Prottay",
        "_id": "5e27f23b6b549b4c28b8ac35",
        "password": "a$gUfMwk6TNWViHihrcxjKg.8EXD04lLkGIWXqzrf8wYokdLQXHxpdy",
        "tokens": [
            {
                "_id": "5e27f23b6b549b4c28b8ac36",
                "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZTI3ZjIzYjZiNTQ5YjRjMjhiOGFjMzUiLCJpYXQiOjE1Nzk2NzYyMTl9.-PWXzlEoPlEZn9F_awtzqrXOtByxUCW9RCdchHF1yKE"
            },
            {
                "_id": "5e280429596e742dcc2f9e30",
                "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZTI3ZjIzYjZiNTQ5YjRjMjhiOGFjMzUiLCJpYXQiOjE1Nzk2ODA4MDl9.7W-QZ55Cc3NFd_-NPyJ0VW_5F1UVrDWAV4xHX63D6tc"
            },
            {
                "_id": "5e280435596e742dcc2f9e31",
                "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZTI3ZjIzYjZiNTQ5YjRjMjhiOGFjMzUiLCJpYXQiOjE1Nzk2ODA4MjF9.vppisFiNNC_DYHtGK0IURzEOCCC5zcWl1v9yD6l1D4I"
            }
        ],
        "__v": 3
    },

在我看来,使用 'tokens.token': token 讲师似乎在尝试遍历 用户的标记 数组以匹配正确的标记。

我说得对吗?如果我是他怎么能在对象解构中使用循环?

讲师没有使用对象解构遍历数组,而是使用 mongodb 语法在您事先不知道索引的数组中搜索文档。

If you do not know the index position of the document nested in the array, concatenate the name of the array field, with a dot (.) and the name of the field in the nested document.

https://docs.mongodb.com/manual/tutorial/query-array-of-documents/#specify-a-query-condition-on-a-field-embedded-in-an-array-of-documents