MongoDB:具有有损数据类型的聚合 $lookup

MongoDB: aggregation $lookup with lossy data type

我有两个合集:

“cats”集合包含键为“ballId”且类型为 string

的文档

“balls”集合包含键为“_id”且类型为 ObjectId

的文档

如果连接是在具有相同数据类型的键上完成的,则聚合内的 $lookup 能够检索结果。但是在我的例子中,“ballId”和“_id”是不同的类型。此代码检索猫但不检索相关的球:

collection('cats').aggregate([
  { $match:{} },
  {
    $lookup: {
      from: "balls",
      localField: "ballId",
      foreignField: "_id",
      as: "balls"
    }
  }
]);

如何使用有损数据类型的 $lookup?

pipeline 阶段使用 $lookup

通过将 balls' _id 转换为字符串 ($toString) 加入两个集合,然后将两个值作为字符串 ($eq) 进行比较。

db.cats.aggregate([
  {
    $match: {}
  },
  {
    $lookup: {
      from: "balls",
      let: {
        ballId: "$ballId"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                {
                  "$toString": "$_id"
                },
                "$$ballId"
              ]
            },
            
          }
        }
      ],
      as: "balls"
    }
  }
])

Sample Mongo Playground