我正在使用聚合框架处理一些旧代码。聚合看起来像这样:
User.aggregate([
{ $match: {
_id: { $in: invitedUserObjectIds, $ne: game.createdBy._id },
...
},
...
]
最初,代码的用户id是字符串形式的,比如['qwertyuiop',...]
。它起作用了。
现在,为了使它正常工作,在将新的ObjectId数组传递到$match
聚合管道阶段之前,我必须将每个字符串id转换为ObjectId。
没什么大不了的,但试着理解为什么会这样,或者我是否错过了一些简单的东西?我测试了完全相同的查询,只将invitedUserObjectIds
更改为字符串id数组或对象id数组。
MongoDB查询运算符是类型敏感的。
为了正确匹配,查询中参数的数据类型必须与数据库中存储的文档中字段的数据类型匹配。
像mongoose中的findById
这样的查询函数将传递的参数强制转换为_id字段的模式中声明的类型。
聚合管道不会自动强制转换值,因此您需要构建数组,使其包含用于匹配的正确数据类型。