$ lookup:计算出的foreinField解决方法?

时间:2018-10-22 13:14:17

标签: mongodb

对于现有的mongo数据库,两个集合之间的链接由

完成:
collA : field collB_id   
collB : field _id = ObjectId("a string value")   

collB_id为_id.valueOf()
即:collA的collB_id的值为“字符串值”
但在$ lookup中:

localField: "collB_id",   
foreignField: _id.valueOf(),   

不工作,那我该怎么办?

Mongodb v3.6

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么您有两个馆藏,其中第一个馆藏(collA)的文档引用了第二个馆藏(collB)的文档。问题是您将引用存储为该objectId的字符串值,因此您不能使用$ lookup来加入这些文档。

collA:

{
    "_id" : ObjectId(...),
    "collB_id" : "123456...",
    ...
}

collB:

{
    "_id" : ObjectId("123456..."),
    ...
}

如果您使用的是mongo 4.0+,则可以通过以下聚合来完成:

db.getCollection('collA').aggregate([
{
   $addFields: {
      converted_collB_id: { $toObjectId: "$collB_id" }
   }
},
{
    $lookup: {
        from: 'collB',
        localField: 'converted_collB_id',
        foreignField: '_id',
        as: 'joined'
    }
}
]);

Mongo 4.0引入了新的聚合管道运算符$toObjectId$toString

这使您可以添加新字段,该字段将是根据collB_id中存储的字符串值创建的ObjectId,并将该新字段用作查找中的localField。

我强烈建议您不要将ObjectId存储为字符串

您已经遇到了$ lookup问题。

此外,ObjectId的大小为12个字节,而其十六进制表示为24个字节(大小的两倍)。您可能还希望对该字段建立索引,因此希望它尽可能小。

ObjectId还包含您可以通过调用getTimestamp()

获得的时间戳。

在可能的情况下使用本机类型使生活更轻松!

希望这会有所帮助!