【问题标题】:Using MongoDB with stream of dictionary objects将 MongoDB 与字典对象流一起使用
【发布时间】:2014-12-23 03:26:00
【问题描述】:

在一个应用程序中,我必须存储和搜索许多半结构化对象(100M+);每个对象都有许多属性,范围从 10 到 10K,其中一些属性会重复出现。通常,一旦存储,对象就不会改变。这些对象可以看作是 Python 字典。

属性是由用户生成的,所以我无法预测他们会创建什么。由于模式经常变化,传统的 DBMS 很难维护,所以我开始研究 MongoDB。乍一看,它看起来很理想,因为我可以将 JSON 对象转储到其中并按属性条件搜索它们。

这是我的 JSON 对象流示例:

{ "my_id": 1,
  "number_of_clients": 30,
  "height": 450,
  "company_code": "fhxA7"
  "name":"example"
  ...
},
{ "my_id": 2,
  "wheels": 4,
  "height": 450,
  "weight": 495,
  "type":"Car",
  "model": "TestZ6"
  ...
}, ...

一段时间后,有成千上万个不同的字段。在这些对象上,我想进行一些比较并对相似的对象进行聚类。查询的示例可能是find all objects that have a field "weight" in range 400-450 and "height" equal to 450

确实,这在小样本上效果很好。将数百万个对象转储到 MongoDB 后,我可能会遇到什么样的可伸缩性问题?索引每个不同的字段是否可行?有没有类似案例的指点?

如果 MongoDB 不适合这种情况,您会推荐其他哪些技术(例如 OLAP)?

【问题讨论】:

    标签: json mongodb search indexing olap-cube


    【解决方案1】:

    除了全文索引,没有办法索引所有字段。在您的情况下,我认为全文不适用。我的建议是:

    不要让用户决定你的数据结构。即使您可以存储它们,使用它们也会很痛苦。您可以随时将它们组织成一个小对象,例如:

    {
      "my_id": 1,
      fields: [{
        name: "number_of_clients",
        value: 30
      }, {
        name: "height",
        value: 450
      }, {
        name: "company_code",
        value: "fhxA7"
      }
      ...
      ]
    }
    

    这不是那么简单,但是您可以在 fields.namefields.value 上建立索引:

    db.coll_name.ensureIndex({"fields.name": 1});
    db.coll_name.ensureIndex({"fields.value": 1});
    

    如有必要,或compound index

    db.coll_name.ensureIndex({"fields.name": 1, "fields.value": 1});
    

    而您的查询将会是:

    包含“重量”的文档

    该对象的value 介于 400 和 450 之间

    使用$elemMatch进行查询:

    db.coll_name.find({
      fields: {
        $elemMatch: {
          name: 'weight',
          value: {$gt: 400, $lt: 450}
        }
      }
    });
    

    作为权衡,您必须自己确保没有重复的字段。

    这就是我现在想到的全部内容。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      相关资源
      最近更新 更多