如何在mongo中存储选项数据?

时间:2012-03-03 01:04:46

标签: mongodb

我有一个网站,我正在使用Mongo。到目前为止,一切进展顺利。我有几个字段是静态选项数据,例如动物品种的字段和动物注册商的另一个字段。

品种

Arabian
Quarter Horse
Saddlebred

登记

AQHA
American Arabians

可能有5到6个不同的集合,范围从5-15个元素。

将这些放入Mongo的最佳方式是什么?现在,我为每个组都有一个单独的集合。这是一个品种集合,一个注册商集合等。

这是最好的方法,还是使用“type”字段指定选项类型的单个静态数据集合更有意义?

或其他完全不同的东西?

3 个答案:

答案 0 :(得分:3)

由于这些数据是静态的,因此最好将数据嵌入文档中。这样您就不必进行手动连接。

并将它存储在一个单独的集合中(一个或多个,无关紧要,选择更容易)以便于演示(渲染组合框等)

答案 1 :(得分:2)

我认为创建多个集合会影响集合大小吗? (关于MongoDB在磁盘上创建一个集合文件的大小是前一个文件大小的两倍[db.0 = 64MB,db.1 = 128MB等等)

这是我能想到的:

<强> 1。存储为单个集合

这里的好处是:

  • 您只需要拨打一次Mongo电话即可获取,如果您可以缓存电话,则可以快速获取数据。
  • 您可以避免重复:创建一个处理所有选项的模式。如果有子选项,你可以嵌套子选项。
  • 当然,您还可以避免在静态/方法中重复修改选项。

我正在研究一个类似的项目。我将类别和子类别都存储在一个集合中。这是一个JSON / BSON转储示例:

在我需要存储“选项”的所有数据中(我的情况下是电台类别)我只使用_id。

{
  "status": {
    "code": 200
  },
  "response": {
    "categories": [
      {
        "cat": "Taxi",
        "_id": "50b92b585cf34cbc0f000004",
        "subcat": []
      },
      {
        "cat": "Bus",
        "_id": "50b92b585cf34cbc0f000005",
        "subcat": [
          {
            "cat": "Bus Rapid Transit",
            "_id": "50b92b585cf34cbc0f00000b"
          },
          {
            "cat": "Express Bus Service",
            "_id": "50b92b585cf34cbc0f00000a"
          },
          {
            "cat": "Public Transport Bus",
            "_id": "50b92b585cf34cbc0f000009"
          },
          {
            "cat": "Tour Bus",
            "_id": "50b92b585cf34cbc0f000008"
          },
          {
            "cat": "Shuttle Bus",
            "_id": "50b92b585cf34cbc0f000007"
          },
          {
            "cat": "Intercity Bus",
            "_id": "50b92b585cf34cbc0f000006"
          }
        ]
      },
      {
        "cat": "Rail",
        "_id": "50b92b585cf34cbc0f00000c",
        "subcat": [
          {
            "cat": "Intercity Train",
            "_id": "50b92b585cf34cbc0f000012"
          },
          {
            "cat": "Rapid Transit/Subway",
            "_id": "50b92b585cf34cbc0f000011"
          },
          {
            "cat": "High-speed Rail",
            "_id": "50b92b585cf34cbc0f000010"
          },
          {
            "cat": "Express Train Service",
            "_id": "50b92b585cf34cbc0f00000f"
          },
          {
            "cat": "Passenger Train",
            "_id": "50b92b585cf34cbc0f00000e"
          },
          {
            "cat": "Tram",
            "_id": "50b92b585cf34cbc0f00000d"
          }
        ]
      }
    ]
  }
}

我调用了我的API来获取该文档(app.ly/api/v1/stationcategories)。我觉得这很容易编码。

在你的情况下你可以有类似的东西:

      {
        "option": "Breeds",
        "_id": "xxx",
        "suboption": [
          {
            "option": "Arabian",
            "_id": "xxx"
          },
          {
            "option": "Quarter House",
            "_id": "xxx"
          },
          {
            "option": "Saddlebred",
            "_id": "xxx"
          }
        ]
      },
      {
        "option": "Registrars",
        "_id": "xxx",
        "suboption": [
          {
            "option": "AQHA",
            "_id": "xxx"
          },
          {
            "option": "American Arabians",
            "_id": "xxx"
          }
        ]
      }

无论何时需要它们,都可以循环播放它们,或从您的收藏中提取特定选项。

<强> 2。存储为静态JSON文档

正如@Sergio所提到的,这是一种可行且更简单的方法。然后,您可以为单独的选项提供单独的文档,也可以将它们放在一个文档中。

  • 您确实在这里失去了一些灵活性,因为您无法通过ID引用选项(我更喜欢这样做,因为更改选项名称不会影响您的所有其他数据)。
  • 容易发生错别字(虽然如果你知道你在做什么,这应该不是问题。)
  • 对于Node.js用户:这可能让您感到头疼require('../../../options.json')类似于PHP。

读者会注意到我对这种方法持消极态度,但它有效,但相当不灵活。 虽然我们不鼓励在MongoDB上不必要地使用连接,但ObjectId引用有时是有用且可扩展的。

一个例子是,如果您的网站在世界某个地区变得流行,并且说来自波兰的人开始占据您网站访问量的50%。如果您决定添加波兰语翻译。您需要返回所有文档,并将波兰语名称(如果存在)添加到您的选项中。如果使用方法1 ,就像在选项中添加波兰语名称一样简单,然后在运行时从选项集合中提取波兰语名称。

除了将每个选项存储为集合

之外,我只能想到2个选项

更新:如果有人对这两种方法都有正面或负面的话,请你添加它们。我的偏见可能对某些人没有帮助,因为存储静态JSON文件有好处

答案 2 :(得分:2)

MongoDB是无模式的,也不支持JOIN。所以你必须退出RDBMS和规范化,因为这纯粹是一种不同类型的数据库。

在设计指南时,您可以应用的规则很少。当然,您可以选择在需要时将其保存在单独的集合中。

静态主/参考数据
您必须始终将它们嵌入到您需要的文档中。由于数据不会被更改,因此保留在同一个集合中并不是一个坏主意。如果数据太大,请将它们分组并将它们存储在单独的集合中,而不是为此主数据本身创建多个集合。

注意:将集合作为子文档嵌入时,请务必确保永远不会超过16MB的限制。这就是MongoDB中每个集合的限制(此时)。

动态母带/参考数据
尝试将它们保存在单独的集合中,因为主数据往往会经常更改。

永远记住,没有加入支持,因此请保持这种方式,以便您可以轻松访问它而无需多次查询数据库。

所以没有建议的最佳方式,它总是根据您的需要而改变,设计可以采用任何一种方式。