我正在尝试使用 mongo 查找运算符来连接两个集合之间的数据。
我有一个名为“公园寻找”的集合
{
"_id": {
"$binary": {
"base64": "5y1dpNaZSEOTJiace1Ta2A==",
"subType": "04"
}
},
"parkID": "9c98c8ee-17a6-4db7-8115-c55fa470480d",
}
我还有另一个名为 city 的集合
{
"_id": {
"$binary": {
"base64": "nJjI7hemTbeBFcVfpHBIDQ==",
"subType": "04"
}
},
"name": "Bellaire",
}
我对公园集合的查找聚合操作如下所示
[
{
$match: {
isDeleted: false,
_id: {
$eq: UUID(
"e72d5da4-d699-4843-9326-269c7b54dad8"
)
}
}
},
{
$lookup: {
from: "city",
localField: "parkID",
let: { parkIdStr: { $toString: "$parkID" } },
foreignField: "_id",
pipeline: [
{
$match: {
$expr: {
$eq: ["$$parkIdStr", "$_id"]
}
}
}
],
as: "city_park_details"
}
}
]
尽管数据有效,但 city_park_details 是一个空数组
发生这种情况是因为park.parkID是一个字符串,而city._id是一个UUID
如何成功查找?
在
$lookup
阶段,您不应使用 localField
和 foreignField
,因为这将执行公园和城市集合之间的连接,并且由于两种数据类型不相同,因此您将不会在city_park_details
数组。
在
pipeline
和$match
阶段,需要先将_id
字段转换为String,然后再匹配文档。
{
from: "city",
let: {
parkIdStr: {
$toString: "$parkID"
}
},
pipeline: [{
$match: {
$expr: {
$eq: ["$$parkIdStr", { $toString: "$_id" }]
}
}
}],
as: "city_park_details"
}