对链接用户进行分组的最佳策略是什么

时间:2017-04-18 08:42:52

标签: node.js mongodb express database-design restful-architecture

一个城市里有人。城市由称为“城市”的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,甚至让后端传递分组的人,如果有人可以提出一些好的建议。

1 个答案:

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