一个城市里有人。城市由称为“城市”的mongodb集合代表。 这个城市的人要么独自一人,要么与同一个城市的另一个人一起走路。
架构是:
{
name: String,
people: [
{
name: String,
status?: String,
walkingWith?: String
}
]
}
如果我的策略是正确的话,我想使用字段“status”和“walkingWith”。
以下是一些条目:
var newyorkPeople = [];
newyorkPeople[0] = {"name": "Jack", "status": "alone", "walkingWith": "none"};
newyorkPeople[1] = {"name": "James", "status": "meeting", "walkingWith": "Maria"};
newyorkPeople[2] = {"name": "Robert", "status": "meeting", "walkingWith": "Nina"};
newyorkPeople[3] = {"name": "Steven", "status": "alone", "walkingWith": "none"};
newyorkPeople[4] = {"name": "Maria", "status": "meeting", "walkingWith": "James"};
newyorkPeople[5] = {"name": "Nina", "status": "meeting", "walkingWith": "Robert"};
然后我进入一个有人的新城市:
db.cities.insert({"name": "New York", "people": newyorkPeople});
现在,我们的目标是让客户(前端)轻松描述这个城市的人们。并将它们分组。 首先展示所有孤独的人。然后是走路的“夫妇”。
我不确定在后端或前端(角度)进行分组是否更好。
在后端(api)我使用express.js。 api可以将所有城市文档返回到前端。然后,前端将负责对人员进行分类/分组。
在这种情况下,我想的策略是:
环绕着人们,只打印孤独的人。与某人同行的人应该进入另一个阵列。 因此,展示所有孤独的人的第一步就完成了。
现在,我仍然需要展示情侣。首先,我需要展示这对夫妇“詹姆斯和玛丽亚”,然后是夫妻“罗伯特和尼娜”。 我应该为每对夫妇创建一个阵列吗?在上面的示例中,它应该创建2个数组。
然而,我不确定这是最好的策略。我很好地修改db-schema,甚至让后端传递分组的人,如果有人可以提出一些好的建议。
答案 0 :(得分:1)
您可以使用以下(简化您的)架构
{
name:Stirng, //name of the person
city:String, //name of the city
status:String, //status
walkingWith:String //name of the person walking with
}
使用此架构的好处是,它可以使您的查询更容易。 让我们来询问您的需求。
1-城市中的所有人
db.city.aggregate([
{$group:{_id:"$city", people:{$push:"$name"}}}
])
2-仅城市中的所有人
db.city.aggregate([
{$match:{status:"alone"}},
{$group:{_id:"$city", people:{$push:"$name"}}}
])
3-城市中与某人会面的所有人
db.getCollection('demos').aggregate([
{$match:{status:"meeting"}},
{$group:{_id:"$city", people:{$push:{name:"$name", walkingWith:"$walkingWith"}}}}
])