【发布时间】:2020-06-08 21:45:50
【问题描述】:
我是来问一个关于mongo聚合函数实现这个例子的问题。
场景
我有 3 个 Mongo 模式,即房子、家庭和教育,它们是:
House: {
_id: ObjectId,
state: Number,
houseNumber: Number
}
Family: {
_id: ObjectId,
houseId: ObjectId,//ref: house
name: String,
gender: String
}
Education: {
_id: ObjectId,
familyId: ObjectId,//ref: Family
level: String, //might be one of ["primary","secondary","higher_secondary"]
}
预期输出:
{
state1: {
primary: {
male: 3,
female: 4
},
secondary: {
male: 4,
female: 8
}
},
state2: {
primary: {
male: 5,
female: 4
},
secondary: {
male: 4,
female: 6
}
}
}
我想按性别和病房对所有教育水平进行分组。
我做了什么:
我是 mongo 世界的新手,最近从 sql 转到 no-sql。我已经这样做了:
let edu = await Education.find({level: "primary"}).populate({
path: "family",
match: {gender: "male"},
select: "house",
populate: {
path: "house",
match: {state: 1},
select: "_id"
}
});
let count = (await edu.filter(each => !isEmpty(each.family) && !isEmpty(each.family.house)).length) || 0;
通过这样做,我得到了从状态 1 学习小学的男性成员的数量。但我不能为每个数据一个一个地调用这个函数。
根据要求,样本数据为:
house = [
{
_id: AA1,
state: 1,
houseNumber: 101
},
{
_id: AA2,
state: 1,
houseNumber: 102
},
{
_id: AA3,
state: 2,
houseNumber: 201
}
];
family = [
{
_id: BB1,
houseId: AA1, //ref: house
name: "John",
gender: "male"
},
{
_id: BB2,
houseId: AA1, //ref: house
name: "Solena",
gender: "female"
},
{
_id: BB3,
houseId: AA2, //ref: house
name: "Efrain",
gender: "male"
},
{
_id: BB4,
houseId: AA3, //ref: house
name: "Naruto",
gender: "male"
}
];
education = [
{
_id: CC1,
familyId: AA1, //ref: Family
level: "primary"
},
{
_id: CC2,
familyId: AA2, //ref: Family
level: "secondary"
},
{
_id: CC3,
familyId: AA3, //ref: Family
level: "primary"
},
{
_id: CC4,
familyId: AA4, //ref: Family
level: "secondary"
}
];
P.S 预期输出与样本数据无关。并且 ObjectId 已被替换为一些唯一的引用。
这里有什么线索吗?
【问题讨论】:
-
您能否举例说明哪些数据存储到这些集合中?或发送样品
-
能否在你的问题中放一个小数据集
-
在您的 House 文档中没有 state 字段,您可以编辑您的问题吗?
-
非常感谢!我添加了一些示例数据。
标签: node.js mongodb mongoose nosql aggregation-framework