【问题标题】:What is the best strategy for grouping linked users对链接用户进行分组的最佳策略是什么
【发布时间】:2017-09-14 00:27:11
【问题描述】:

城市里有人。一个城市由一个名为“城市”的 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 甚至让后端交付分组的人。

【问题讨论】:

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


    【解决方案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"}}}}
    ])
    

    【讨论】:

    • 谢谢。听起来可能是一个很好的解决方案。但我不确定我是否完全理解它。是城市集合的架构吗?我没有看到人员数组。
    • 现在,根据我对每个人的架构,您需要分别插入一个文档。现在不需要人阵了。查看架构中的 cmets(更新了 cmets)
    • 仍然需要任何解释,请随时询问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2020-10-22
    • 2010-09-08
    相关资源
    最近更新 更多