分组链接用户的最佳策略是什么?

有一个城市里有人。 一个城市由一个名为“城市”的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}); 

现在,我们的目标是让客户(前端)很容易地描述这个城市里有什么人。 并把他们分组。 首先显示所有孤独的人。 然后那些正在走路的“夫妻”

林不知道是否在后端或前端(angular)分组更好。

在后端(API)我使用express.js。 api可以将所有的城市文档返回到前端。 然后前端负责对人员进行分类/分组。

在那种情况下,我想到的战略是:

循环通过人,只打印孤独的人。 那些和别人一起散步的人应该去另一个arrays。 所以,向所有孤独的人展示的第一步就完成了。

现在,我仍然需要展示夫妻。 首先,我需要展示夫妇“詹姆斯和玛丽亚”,然后是情侣“罗伯特和妮娜”。 我应该为每对夫妇创build一个数组吗? 在上面的例子中,它应该创build2个数组。

但是,林不知道这是最好的策略。 在修改数据库模式,甚至让后端交付分组的人,如果有人可以得到一些好的build议,我很好。

你可以使用下面的(简化你的)模式

 { 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"}}} ]) 

只有一个城市的所有人

 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"}}}} ])