如何使用$lookup和DbRef在MongoDB和NodeJS中连接两个集合?

3
如果我有两个集合,其中一个包含dbref,如何使用$lookup和dbref进行连接?

1
基本上不行。$lookup 依赖于在其他集合中“匹配字段”。因此,如果一个字段是 BSON 类型的 DBref,而另一个字段是 ObjectId,那么这两个“类型”就不同,因此不会匹配。作为相关问题,$lookup 不能使用 DBRef 中的数据,例如“集合”,您需要手动指定。因此,您应该使用常规的 ObjectId 值,而不是 DBRefDBRef 是“邪恶”的另一个原因。不要使用它。 - Neil Lunn
可能是Mongo如何使用DBRef进行$lookup的重复问题。 - Olivier Maurel
1个回答

0

DBref是一个BSON对象,不能使用其值进行查找。

但是,有一种方法可以将DBRef对象转换为数组。 我几个月前写了一个答案描述如何做到这一点。

简短的解释

假设你有这样一个DBRef对象:

myField: DBRef("otherCollection", ObjectId("582abcd85d2dfa67f44127e0")),

使用 $objectToArray 对 myField 进行如下操作

db.myColl.aggregate([
    {
        $project: { 
            transformedDBRef: {$objectToArray: "$myField"},                
            }    
    },    
])

结果将是一个包含两个对象的数组,一个对象用于引用,另一个对象用于DBRef中包含的ObjectId,每个对象都有一个"k"字段和一个"v"字段。它看起来像这样:

transformedDBRef: [{"k" : "$ref","v" : "otherCollection"},{"k" : "$id","v" : ObjectId("582abcd85d2dfa67f44127e0")}

你可以使用grep命令来获取ObjectId。完整的解决方案请查看上面的链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接