首页 > 解决方案 > 需要将用户 ID 数组转换为 ObjectId 以在聚合函数中使用

问题描述

我正在使用聚合框架处理一些旧代码。聚合看起来像这样:

User.aggregate([
  { $match: {
     _id: { $in: invitedUserObjectIds, $ne: game.createdBy._id },
    ...
  },
...
]
    

最初,该代码具有类似这样的字符串形式的用户 ID ['qwertyuiop',...]。它正在工作。

现在为了让它正常工作,我必须在将新的 ObjectId 数组传递给$match聚合管道阶段之前将每个字符串 id 转换为 ObjectId。

没什么大不了的,但试图理解为什么会这样,或者我是否遗漏了一些简单的东西?我测试了完全相同的查询,只invitedUserObjectIds更改为字符串 ID 数组或对象 ID 数组。

标签: mongodbmongooseaggregate

解决方案


MongoDB 查询运算符是类型敏感的。

为了正确匹配,查询中参数的数据类型必须与存储在数据库中的文档中字段的数据类型匹配。

像猫鼬这样的查询函数findById将传递的参数转换为模式中为 _id 字段声明的类型。

聚合管道不会自动转换值,因此您需要构建数组以使其包含正确的数据类型以进行匹配。


推荐阅读