如何在mongo中执行Stringified id和ObjectId之间的$ lookup?

时间:2017-09-01 11:07:48

标签: mongodb

方案

我必须在名为大学学生的2个集合上执行联接。我正在使用 MongoDB 3.4 。在这里,大学有一个名为studentId的字段,该字段引用学生集合的_id。 问题是,studentId已经以字符串形式存储,而_id是ObjectId。

  

studentId的例子:" 5910193d4c00000a01c2c615"

     

_id的例子:ObjectId(" 59a931696d00007c0962e24a")

所以,当我尝试关注加入查询时:

db.college.aggregate(
    {
        $lookup: {
           from: "student",
           localField: "studentId",
           foreignField: "_id",
           as: "Related"
        }
    })

它不起作用,因为 localField studentId foreignField _id的类型不同。那么,是否有某种方式studentId被转换/与_id进行比较,以便可以执行连接操作?

2 个答案:

答案 0 :(得分:0)

打算这样做:

college(studentId)  --- > student (_id)
 string             ---->     ObjectId


we need to convert to ObjectId

    db.college.aggregate([
     {
 "$addFields": {
    "newStudentId" :  { "$toObjectId": "$studentId" }
       }
    },{
        $lookup: {
           from: "student",
           localField: "newStudentId",
           foreignField: "_id",
           as: "Related"
        }
    }])

答案 1 :(得分:0)

如果已升级到mongodb 4.0。他们添加了通过"_id.str"将对象ID转换为字符串的功能。 因此,您的整体查询可能就像

db.college.aggregate(
{
    $lookup: {
       from: "student",
       localField: "studentId",
       foreignField: "_id.str",
       as: "Related"
    }
})

这应该很好。