【发布时间】:2022-02-09 18:58:36
【问题描述】:
我有 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 的情况下完成此操作 - 结果相同。
非常感谢任何帮助。
【问题讨论】:
-
您需要
$unwind"$menuData"然后在"menuData.items"上执行$lookup(对于localField)。
标签: javascript node.js mongodb aggregation-framework