MongoDB:具有有损数据类型的聚合 $lookup
MongoDB: aggregation $lookup with lossy data type
我有两个合集:
- 猫
- 球
“cats”集合包含键为“ballId”且类型为 string
的文档
“balls”集合包含键为“_id”且类型为 ObjectId
的文档
如果连接是在具有相同数据类型的键上完成的,则聚合内的 $lookup 能够检索结果。但是在我的例子中,“ballId”和“_id”是不同的类型。此代码检索猫但不检索相关的球:
collection('cats').aggregate([
{ $match:{} },
{
$lookup: {
from: "balls",
localField: "ballId",
foreignField: "_id",
as: "balls"
}
}
]);
如何使用有损数据类型的 $lookup?
在 pipeline 阶段使用 $lookup
。
通过将 balls
' _id
转换为字符串 ($toString
) 加入两个集合,然后将两个值作为字符串 ($eq
) 进行比较。
db.cats.aggregate([
{
$match: {}
},
{
$lookup: {
from: "balls",
let: {
ballId: "$ballId"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
{
"$toString": "$_id"
},
"$$ballId"
]
},
}
}
],
as: "balls"
}
}
])
我有两个合集:
- 猫
- 球
“cats”集合包含键为“ballId”且类型为 string
“balls”集合包含键为“_id”且类型为 ObjectId
如果连接是在具有相同数据类型的键上完成的,则聚合内的 $lookup 能够检索结果。但是在我的例子中,“ballId”和“_id”是不同的类型。此代码检索猫但不检索相关的球:
collection('cats').aggregate([
{ $match:{} },
{
$lookup: {
from: "balls",
localField: "ballId",
foreignField: "_id",
as: "balls"
}
}
]);
如何使用有损数据类型的 $lookup?
在 pipeline 阶段使用 $lookup
。
通过将 balls
' _id
转换为字符串 ($toString
) 加入两个集合,然后将两个值作为字符串 ($eq
) 进行比较。
db.cats.aggregate([
{
$match: {}
},
{
$lookup: {
from: "balls",
let: {
ballId: "$ballId"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
{
"$toString": "$_id"
},
"$$ballId"
]
},
}
}
],
as: "balls"
}
}
])