对链接用户进行分组的最佳策略是什么
What is the best strategy for grouping linked users
一城有人。城市由名为 "cities" 的 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});
现在,我们的目标是让客户(前端)更容易描述这个城市的人。并将它们分组。
首先展示所有孤独的人。然后一起走的"couples"
我不确定在后端还是在前端进行分组更好 (angular)。
在后端 (api) 我正在使用 express.js。 api 可以只 return 所有城市文档到前端。然后前端将对 sort/group 人员负责。
在那种情况下,我考虑的策略是:
遍历人物,只打印单独的人物。与人同行者,应另排。
至此第一步,向所有孤独的人展示,就完成了。
现在,我还需要展示情侣。首先,我需要展示 "James and Maria" 对,然后 "Robert and Nina" 对。
我应该为每对夫妇创建一个数组吗?在上面的示例中,它应该创建 2 个数组。
但是,我不确定这是最好的策略。如果有人能提出一些好的建议,我可以修改 db-schema 甚至让后端传送分组的人。
您可以使用以下(简化的)架构
{
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"}}}}
])
一城有人。城市由名为 "cities" 的 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});
现在,我们的目标是让客户(前端)更容易描述这个城市的人。并将它们分组。 首先展示所有孤独的人。然后一起走的"couples"
我不确定在后端还是在前端进行分组更好 (angular)。
在后端 (api) 我正在使用 express.js。 api 可以只 return 所有城市文档到前端。然后前端将对 sort/group 人员负责。
在那种情况下,我考虑的策略是:
遍历人物,只打印单独的人物。与人同行者,应另排。 至此第一步,向所有孤独的人展示,就完成了。
现在,我还需要展示情侣。首先,我需要展示 "James and Maria" 对,然后 "Robert and Nina" 对。 我应该为每对夫妇创建一个数组吗?在上面的示例中,它应该创建 2 个数组。
但是,我不确定这是最好的策略。如果有人能提出一些好的建议,我可以修改 db-schema 甚至让后端传送分组的人。
您可以使用以下(简化的)架构
{
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"}}}}
])