$lookup:计算前字段解决方法?



对于现有的mongo数据库,2个集合之间的链接由下式完成:

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(),   

不工作,那我该怎么办?

蒙戈德 v3.6

如果我理解正确,您有两个集合,其中第一个集合 (collA( 的文档引用第二个集合 (collB( 的文档。问题是您将引用存储为该 objectId 的字符串值,因此您不能使用 $lookup 来连接这些文档。

列拉:

{
"_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()来获取

时间戳尽可能使用本机类型,让您的生活更轻松!

希望这有帮助!

最新更新