对于现有的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
答案 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()
在可能的情况下使用本机类型使生活更轻松!
希望这会有所帮助!