Mongodb 我是否可以通过规范化和只存储每个文档中的值来减少mongo数据库的大小?

Mongodb 我是否可以通过规范化和只存储每个文档中的值来减少mongo数据库的大小?,mongodb,Mongodb,我是Mongo的新手,决定尝试一下我的日期集,我现在将其存储在MySQL中。我从一个表开始,它现在变成了文档集合 每个文档大约有30个属性,每个属性通常是一个短字符串。所以在MySQL中,我有varchar字段,而在Mongo中,它只是BSON 当我发现Mongo中的数据库大小几乎是mysql innodb的7倍时,我真的很惊讶。它拥有1500000条记录/文档,在MySQL中约为350MB,在Monbo中约为2.3GB,因为它存储每个数据段的属性名称 有没有办法提出“模式”并规范化数据以减少数

我是Mongo的新手,决定尝试一下我的日期集,我现在将其存储在MySQL中。我从一个表开始,它现在变成了文档集合

每个文档大约有30个属性,每个属性通常是一个短字符串。所以在MySQL中,我有varchar字段,而在Mongo中,它只是BSON

当我发现Mongo中的数据库大小几乎是mysql innodb的7倍时,我真的很惊讶。它拥有1500000条记录/文档,在MySQL中约为350MB,在Monbo中约为2.3GB,因为它存储每个数据段的属性名称

有没有办法提出“模式”并规范化数据以减少数据库大小

UPD: 我使用MongoDB 3.4,由于
db.serverstatus().storageEngine.name
mmapv1
,我想我使用MMap

样本文件:

{
  "_id" : ObjectId("595c4f4342ce99299c19c379"),
  "someNumber" : "11420",
  "companyDataFromSource1" : {
    "lolNumber" : "11420",
    "businessName" : "Feather mighty shop Inc",
    "businessOwner" : "",
    "businessHealthCode" : "Q",
    "realUpdateDate" : "13-OCt-16",
    "someNumericInfo" : "10000",
    "yearWhenItHappened" : "2014",
    "moreDate" : "22-Jan-02",
    "anotherStatus" : "DE",
    "numValue1" : "1",
    "numValue2" : "1",
    "someProp" : "E",
    "anotherProp" : "R",
    "street" : "BB251 Database St",
    "city" : "Denver",
    "state" : "CO",
    "zip" : "12345",
    "country" : "US",
    "anotherStreet" : "TT251 Server St",
    "anotherCity" : "Sratford",
    "anotherState" : "WI",
    "anotherZip" : "54484",
    "anotherCountry" : "US",
    "telephone" : "(123) 481-2222",
    "fax" : "",
    "emailAddress" : "qwwqwwqeewe@hotmail.com",
  }
}
db.collecion('collection')。统计结果:

{
  "ns" : "db.collection",
  "size" : 1507059792.0,
  "count" : 1495099,
  "avgObjSize" : 1008,
  "numExtents" : 19,
  "storageSize" : 1580150784.0,
  "lastExtentSize" : 415174656.0,
  "paddingFactor" : 1.0,
  "paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
  "userFlags" : 1,
  "capped" : false,
  "nindexes" : 1,
  "totalIndexSize" : 60518752,
  "indexSizes" : {
      "_id_" : 60518752
  },
"ok" : 1.0
}
有没有办法提出“模式”并减少数据库大小


不,Mongodb是无模式的,这是它的核心特性之一。您可以为您的属性使用较短的名称。或者使用压缩存储引擎(WiredTiger)。

关于如何减少数据库大小的一些提示:

数据库引擎 首先,从MMApv1切换到WiredTiger存储引擎,因为这样可以更有效地压缩数据。 默认压缩级别为snappy,但您可以使用zlib进行更大的压缩,而无需牺牲性能。有关详细信息,请参阅

要移动到WiredTiger,请参阅MongoDB文档中的本教程:

减少密钥大小 第二件事是减小文档大小(根据
avgObjSize
字段,当前约1008字节)。为此,请使用较小的键(最好是两个字母长的键)。 比如说,

companyDataFromSource1
==>
c1


启用压缩后,这样做的好处很小,但这始终是一个好的做法,因为它可以减少通过网络发送到应用程序的数据大小

您的mongodb版本是什么?您使用的是哪个引擎(WiredTiger、MMap等)?压缩级别是多少?你能提供一份你收集的样本文档,以及
db.collection.stats()
命令的输出吗?@fellix我已经更新了这个问题,非常感谢!切换到WiredTiger将数据库文件的大小减少到417 Mb,这至少与MySQL数据库大小相当。