如何在MongoDB中处理大型数据集

时间:2015-08-03 18:23:39

标签: mongodb database-design database nosql

我需要帮助来决定哪种架构类型更适合我的mongodb集合。

假设我想存储一个人拥有的东西列表。会有相对少数人,但是一个人可以拥有很多东西。我们假设人们会计入数百,但是一个人拥有数十万

我可以想到两个选择:

选项1:

    [{
        id: 1,
        name: "Tom",
        things: [
            {
                name: 'red tie',
                weight: 0.3,
                value: 5
            },
            {
                name: 'carpet',
                weight: 15,
                value: 700
            } //... and 300'000 other things 
        ]
    },
    {
        id: 2,
        name: "Rob",
        things: [
            {
                name: 'can of olives',
                weight: 0.4,
                value: 2
            },
            {
                name: 'Porsche',
                weight: 1500,
                value: 40000
            }// and 170'000 other things
        ]
    }//and 214 oher people]
]

选项2:

[
    {
        name: 'red tie',
        weight: 0.3,
        value: 5,
        owner: {
            name: 'Tom',
            id: 1
        }
    },
    {
        name: 'carpet',
        weight: 15,
        value: 700,
        owner: {
            name: 'Tom',
            id: 1
        }
    },
    {
        name: 'can of olives',
        weight: 0.4,
        value: 2,
        owner: {
            name: 'Rob',
            id: 2
        }
    },
    {
        name: 'Porsche',
        weight: 1500,
        value: 40000,
        owner: {
            name: 'Rob',
            id: 2
        }
    }// and 20'000'000 other things
];
  1. 我只会在一个请求中向一位所有者提出的内容,而不会向多个所有者索要内容。
  2. 我需要分页作为返回的事项列表,所以......
  3. ......事情需要通过其中一个参数
  4. 排序

    根据我的理解,第一点建议使用选项1(仅查询数百个文档而不是数百万个)会更有效率,但使用选项2时更容易处理第2点和第3点(限制,跳过和排序方法,而不是$ slice projection和Aggregation Framework)。

    有谁能告诉我哪种方式更合适?或者也许我有错误,还有更好的解决方案?

1 个答案:

答案 0 :(得分:2)

  
      
  1. 我只会在一个请求中向一位所有者索要内容,而不会向多个所有者索要内容。
  2.   
  3. 我需要为返回的事项列表分页,所以......
  4.   
  5. 事情需要按其中一个参数
  6. 排序   

通过创建每个项目是单个文档的集合,您的要求2和3将更好地实现。使用数组,您必须使用聚合框架来展开该数组,这可能变得非常慢。您可以通过在所述集合的owner.nameowner.id字段上创建索引来轻松优化您的第一个要求,具体取决于您用于查询的内容。

此外,MongoDB不能很好地处理增长的文档。为了阻止用户创建无限增长的文档,MongoDB每个文档限制为16MB。当您的每个项目都是几百字节时,数十万个数组条目将超过该限制。