我正在使用MongoDB开发nodeJS应用程序,我正在努力构建一个查询。我已经浏览了MongoDB文档和聚合概念,但仍然无法管理它
因此,我收集了一组Item
文档,如下所示:
Item schema -> { id: number, status: string, category: string, subCategory: string }
E.g.:
[
...
{
id: 38219388214034,
status: 'inStock',
category: 'Food',
subCategory: 'Sweet'
},
{
id: 18371917455611,
status: 'pending',
category: 'Accessories',
subCategory: 'Other'
}
...
]
status
只能具有三种状态中的一种:inStock
、outOfStock
和pending
。subCategory
与category
(是另一个集合,Category
集合(具有以下关系:
Category schema -> { category: string, subCategory: Array<string> }
E.g.:
[
...
{ category: 'Food', subCategory: ['Sour', 'Sweet', 'Other'] },
{ category: 'Sports', subCategory: ['T-Shirt', 'Shorts', 'Ball', 'Other'] },
{ category: 'Accessories', subCategory: ['Drill Bits', 'Screws', 'Fluids', 'Other'] }
...
]
我试图实现的是创建一个查询,返回一个对象数组,其中包含与其类别相关的每个子类别的计数,如:
子类别 | 类别 | inStock | outOfStock | 待处理>项目总数 | ||
---|---|---|---|---|---|---|
酸味 | 食品 | 3 | >16 | //tr>|||
其他 | 食品 | 08 | >12 | >其他 | 附件 | >42
一个选项是category
和subCategory
同时使用$group
,因此结果是一个文档,每个category
和subCategory
对都有所有status
选项:
编辑:
db.items.aggregate([
{$group: {
_id: {
subCategory: "$subCategory",
category: "$category"
},
totalCount: {$sum: 1},
pending: {$sum: {$cond: [{$eq: ["$status", "pending"]}, 1, 0]}},
inStock: {$sum: {$cond: [{$eq: ["$status", "inStock"]}, 1, 0]}},
outOfStock: {$sum: {$cond: [{$eq: ["$status", "outOfStock"]}, 1, 0]}}
}
}
])
看看它是如何在操场上工作的例子