MongoDB - 与嵌套数组的聚合不起作用
MongoDB - Aggregate with nested array not working
我有 2 个使用简单嵌套数组的集合。记录示例如下所示:
菜单
{
"_id" : ObjectId("620323fe80ec16abea7a0205"),
"name" : "A new menu",
"description" : "",
"menuData" : [
{
"catName" : "Cat 2",
"items" : [
"61ded42461b1d8966c5efc45",
"61ded55001e3cafb8db19198",
"61df9adf2441b6113033f341",
"61dfa8c82441b6113033f738"
]
},
{
"catName" : "Cat 1",
"items" : [
"62020691adda4aab89f1742d",
"61dfa8c82441b6113033f738"
]
}
],
"status" : "active",
}
并且我正在尝试完成对菜单项数组 (menuData.items) 的查找。这些是来自另一个集合的对象 ID。
菜单项
一个例子是:
{
"_id" : ObjectId("61ded55001e3cafb8db19198"),
"name" : "Coca-Cola 600ml",
"description" : "Refreshing taste...ahhh",
"price" : 3.95,
"tags" : [
"drinks"
],
"options" : [
],
"status" : "active",
}
使用以下聚合,我没有得到查找的输出
db.getCollection("menus").aggregate(
[
{
"$match" : {
"_id" : ObjectId("620323fe80ec16abea7a0205")
}
},
{
"$addFields" : {
"newField" : "$menuData.items"
}
},
{
"$unwind" : {
"path" : "$newField"
}
},
{
"$lookup" : {
"from" : "menuitems",
"localField" : "newField",
"foreignField" : "_id",
"as" : "items"
}
}
]
);
输出
{
"_id" : ObjectId("620323fe80ec16abea7a0205"),
"name" : "A new menu",
"description" : "",
"menuData" : [
{
"catName" : "Cat 2",
"items" : [
"61ded42461b1d8966c5efc45",
"61ded55001e3cafb8db19198",
"61df9adf2441b6113033f341",
"61dfa8c82441b6113033f738"
]
},
{
"catName" : "Cat 1",
"items" : [
"62020691adda4aab89f1742d",
"61dfa8c82441b6113033f738"
]
}
],
"status" : "active",
"createdBy" : ObjectId("61bb07c778e39ca45c161d81"),
"createdByModel" : "Administrator",
"createdAt" : ISODate("2022-02-09T02:16:30.108+0000"),
"updatedAt" : ISODate("2022-02-09T04:26:00.837+0000"),
"__v" : NumberInt(0),
"newField" : [
"61ded42461b1d8966c5efc45",
"61ded55001e3cafb8db19198",
"61df9adf2441b6113033f341",
"61dfa8c82441b6113033f738"
],
"items" : [
]
}
如您所见,项目是空的。我尝试在没有 $addFields
和 $unwind
的情况下完成此操作 - 结果相同。
非常感谢任何帮助。
- 将 ObjectId 转换为字符串(
newFields
保存一组 Id 字符串,而 menuItems
文档 Id 是一个 ObjectId
)
- 通过
$in
检查转换后的 id
字符串是否在 newFields
数组中。
{
"$lookup": {
"from": "menuitems",
let: {
newField: "$newField"
},
pipeline: [
{
$match: {
$expr: {
$in: [
{
$toString: "$_id"
},
"$$newField"
]
}
}
}
],
"as": "items"
}
}
我有 2 个使用简单嵌套数组的集合。记录示例如下所示:
菜单
{
"_id" : ObjectId("620323fe80ec16abea7a0205"),
"name" : "A new menu",
"description" : "",
"menuData" : [
{
"catName" : "Cat 2",
"items" : [
"61ded42461b1d8966c5efc45",
"61ded55001e3cafb8db19198",
"61df9adf2441b6113033f341",
"61dfa8c82441b6113033f738"
]
},
{
"catName" : "Cat 1",
"items" : [
"62020691adda4aab89f1742d",
"61dfa8c82441b6113033f738"
]
}
],
"status" : "active",
}
并且我正在尝试完成对菜单项数组 (menuData.items) 的查找。这些是来自另一个集合的对象 ID。
菜单项 一个例子是:
{
"_id" : ObjectId("61ded55001e3cafb8db19198"),
"name" : "Coca-Cola 600ml",
"description" : "Refreshing taste...ahhh",
"price" : 3.95,
"tags" : [
"drinks"
],
"options" : [
],
"status" : "active",
}
使用以下聚合,我没有得到查找的输出
db.getCollection("menus").aggregate(
[
{
"$match" : {
"_id" : ObjectId("620323fe80ec16abea7a0205")
}
},
{
"$addFields" : {
"newField" : "$menuData.items"
}
},
{
"$unwind" : {
"path" : "$newField"
}
},
{
"$lookup" : {
"from" : "menuitems",
"localField" : "newField",
"foreignField" : "_id",
"as" : "items"
}
}
]
);
输出
{
"_id" : ObjectId("620323fe80ec16abea7a0205"),
"name" : "A new menu",
"description" : "",
"menuData" : [
{
"catName" : "Cat 2",
"items" : [
"61ded42461b1d8966c5efc45",
"61ded55001e3cafb8db19198",
"61df9adf2441b6113033f341",
"61dfa8c82441b6113033f738"
]
},
{
"catName" : "Cat 1",
"items" : [
"62020691adda4aab89f1742d",
"61dfa8c82441b6113033f738"
]
}
],
"status" : "active",
"createdBy" : ObjectId("61bb07c778e39ca45c161d81"),
"createdByModel" : "Administrator",
"createdAt" : ISODate("2022-02-09T02:16:30.108+0000"),
"updatedAt" : ISODate("2022-02-09T04:26:00.837+0000"),
"__v" : NumberInt(0),
"newField" : [
"61ded42461b1d8966c5efc45",
"61ded55001e3cafb8db19198",
"61df9adf2441b6113033f341",
"61dfa8c82441b6113033f738"
],
"items" : [
]
}
如您所见,项目是空的。我尝试在没有 $addFields
和 $unwind
的情况下完成此操作 - 结果相同。
非常感谢任何帮助。
- 将 ObjectId 转换为字符串(
newFields
保存一组 Id 字符串,而menuItems
文档 Id 是一个ObjectId
) - 通过
$in
检查转换后的id
字符串是否在newFields
数组中。
{
"$lookup": {
"from": "menuitems",
let: {
newField: "$newField"
},
pipeline: [
{
$match: {
$expr: {
$in: [
{
$toString: "$_id"
},
"$$newField"
]
}
}
}
],
"as": "items"
}
}