mongodb - MongoDB 按产品的子类别聚合和分组
问题描述
我有一个看起来像这样的 MongoDB 架构
const ProductModel = new Schema({
subcategory: {
type : mongoose.Schema.Types.ObjectId,
ref : "Subcategory",
},
product_name: {
type: String
},
description: {
type: String
},
price: {
type: Number
},
});
和一个子类别架构:
const SubcategoryModel = new Schema({
subcategoryName: {
type: String,
}
});
聚合之前的输入查询如下所示:
[
{
"_id": "111",
"subcategory": {
"_id": "456",
"categoryName": "Sneakers",
},
"product_name": "Modern sneaker",
"description": "Stylish",
"price": 4400
},
{
"_id": "222",
"subcategory": {
"_id": "456",
"categoryName": "Sneakers",
},
"product_name": "Blue shoes",
"description": "Vived colors",
"price": 7500
},
{
"_id": "333",
"subcategory": {
"_id": "123",
"categoryName": "Jackets",
"__v": 0
},
"product_name": "Modern jacket",
"description": "Stylish",
"price": 4400
},
}
]
查询的最终结果应如下所示:
{
"Sneakers":[
{
"product_name":"Modern sneaker",
"description":"Stylish",
"price":"4400"
},
{
"product_name":"Blue shoes",
"description":"Vived colors",
"price":"7500"
},
"Jackets":{
"...."
}
]
}
聚合前的子类:
"subcategories": [
{
"_id": "123",
"categoryName": "Jackets",
},
{
"_id": "456",
"categoryName": "Sneakers",
}
]
我正在尝试填充子类别,然后按产品的 subcategoryName 字段对产品进行分组。
解决方案
您可以使用此聚合查询:
- 首先
$lookup
做之间的连接Product
和Subcategory
创建数组subcategories
。 - 然后使用 解构数组
$unwind
。 $group
通过子产品的名称使用 . 添加整个对象$$ROOT
。- 传递您想要使用的字段
$project
。 - 并将
replaceRoot
键值作为Sneakers
和放入数组中Jackets
。
db.Product.aggregate([
{
"$lookup": {
"from": "Subcategory",
"localField": "subcategory.categoryName",
"foreignField": "categoryName",
"as": "subcategories"
}
},
{
"$unwind": "$subcategories"
},
{
"$group": {
"_id": "$subcategories.categoryName",
"data": {
"$push": "$$ROOT"
}
}
},
{
"$project": {
"data": {
"product_name": 1,
"description": 1,
"price": 1
}
}
},
{
"$replaceRoot": {
"newRoot": {
"$arrayToObject": [
[
{
"k": "$_id",
"v": "$data"
}
]
]
}
}
}
])
这里的例子
使用您提供的数据,结果是:
[
{
"Sneakers": [
{
"description": "Stylish",
"price": 4400,
"product_name": "Modern sneaker"
},
{
"description": "Vived colors",
"price": 7500,
"product_name": "Blue shoes"
}
]
},
{
"Jackets": [
{
"description": "Stylish",
"price": 4400,
"product_name": "Modern jacket"
}
]
}
]
推荐阅读
- excel - 从 excel 数据转储中整理混乱的日期时间单元格
- reactjs - 如何在 React Hooks 中推送状态?
- python - tkinter 不打开图像
- python - 如何将嵌套的 JSON 转换为 CSV
- javascript - 在 nextjs 应用程序中加载 index.js 页面时 router.query 为空
- php - 在 Windows 上使用 Mamp 安装 Wp-cli.phar
- c++ - 为什么工会成员数据没有默认初始化?
- algorithm - 使用 cvxopt 获取半定规划解决方案的迭代次数
- angular - 在angular10中调用summernote回调的问题
- r - 如何将 16 位 TIFF 读入 R 并保留像素强度,以便可以使用 EBImage 包将其用作标记对象掩码?