mongodb - mongoDB, mongoose - 聚合对象数组
问题描述
我有 3 个要汇总的集合。
第一个是颜色集合
{
{
_id: 1, <- mongoose objectId
name: red
},
{
_id: 2, <- mongoose objectId
name: green
}
}
二是产品
{
{
_id: Id777, <- mongoose objectId
productName: test prod 777
},
{
_id: Id888, <- mongoose objectId
productName: test prod 888
}
}
第三个它移动集合
{
....other fields here
items: [
{
_id: an mongoose id,
itemId: Id777 <- in products collection,
itemColor: 1 <- id in colors collection,
coutn: 7,
....other fields
},
{
_id: an mongoose id,
itemId: Id888 <- in products collection,
itemColor: 2 <- id in colors collection
cout: 10
....other fields
}
]
}
我需要有这样的输出:
{
////information from collection
items: [
{
itemId: test prod 777, itemColor: red, count: 7
},
{
itemId: test prod 888, itemColor: green, count: 10
}
]
}
我的代码是:
const moves = await ProductMoves.aggregate([
{ $match: query }, // this is my query
{
$lookup: {
from: 'products',
localField: 'items.itemId',
foreignField: '_id',
as: 'productName'
}
},
{
$unwind: { path: "$productName" , preserveNullAndEmptyArrays: true }
},
{
$lookup: {
from: 'colors',
localField: 'items.itemColor',
foreignField: '_id',
as: 'cName'
}
},
{
$unwind: { path: "$cName" , preserveNullAndEmptyArrays: true }
},
{
$addFields: {
mItems: {
prName: "$productName.productName",
prColor: "$cName.colorName"
},
productName: 0,
cName: 0
}
}
])
.sort({addedDate: -1})
.skip(+req.query.offset)
.limit(+req.query.limit)
但它只返回对象数组中的 1 个元素。可能我需要类似 for 循环的东西,但我做不到。
感谢您的回复,祝您有美好的一天!
解决方案
$unwind
解构items
数组$lookup
带products
收藏$lookup
带colors
收藏$addFields
,$arrayElemAt
从查找结果中获取第一个元素$group
通过_id
并重建items
数组并传递其他字段- 聚合函数中没有外部方法,您必须使用阶段进行排序、跳过和限制,如下所示
$sort
按addedDate
降序排列$skip
和$limit
结果
const moves = await ProductMoves.aggregate([
{ $match: query }, // this is my query
{ $unwind: "$items" },
{
$lookup: {
from: "products",
localField: "items.itemId",
foreignField: "_id",
as: "itemId"
}
},
{
$lookup: {
from: "colors",
localField: "items.itemColor",
foreignField: "_id",
as: "itemColor"
}
},
{
$addFields: {
"items.itemId": { $arrayElemAt: ["$itemId.productName", 0] },
"items.itemColor": { $arrayElemAt: ["$itemColor.name", 0] }
}
},
{
$group: {
_id: "$_id",
items: { $push: "$items" },
addedDate: { $first: "$addedDate" }
// add other fields that you want in result like "addedDate"
}
},
{ $sort: { addedDate: -1 } },
{ $skip: +req.query.offset },
{ $limit: +req.query.limit }
])
推荐阅读
- python-2.7 - 如何在python中同时(并行)运行多个可执行文件(* .exe)?
- c# - 格式化标签内容字体
- jdbc - Athena 使用 ALTER TABLE ADD PARTITION 抛出 Simba JDBC 11300
- java - 您如何检查两个提交是否仅在代码格式上有所不同
- r - 用 R 绘制和线性回归模型
- c++ - 在计算类型后省略参数名称
- javascript - 如果 API 请求给出字符串,如何告诉 JS 仅替换 HTML?
- android - 放大和缩小时如何调整制造商大小
- android - 程序类型已经存在:androidx.core.R
- r - 添加一个新列替换 R 中的 NA 值