如果我有两个集合,其中一个包含dbref,如何使用$lookup和dbref进行连接?
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")}
$lookup
依赖于在其他集合中“匹配字段”。因此,如果一个字段是 BSON 类型的DBref
,而另一个字段是ObjectId
,那么这两个“类型”就不同,因此不会匹配。作为相关问题,$lookup
不能使用DBRef
中的数据,例如“集合”,您需要手动指定。因此,您应该使用常规的ObjectId
值,而不是DBRef
。DBRef
是“邪恶”的另一个原因。不要使用它。 - Neil Lunn