我有一大堆JSON文档,我愿意将它存储在MongoDB中。
然而,鉴于我只是在少数几个领域进行搜索和检索,我从性能方面想知道哪种方式更好。
一个选项是将大对象存储为JSON / BSON,因此文档将如下所示:
{
"key_1": "Value1",
"key_2": "Value2",
"external_data": {
"large": {
"data": [
"comes",
"here"
]
}
}
}
或者,
{
"key_1": "Value1",
"key_2": "Value2",
"external_data": '{"large":{"data":["comes","here"]}}'
}
答案 0 :(得分:2)
我认为将数据存储在BSON中既有性能又节省空间。通过这种方式,您将来“投资”:如果您现在将数据存储为BSON,那么如果出现此类要求,则可以稍后对其进行数据库查询。
但无论如何,如果您关注的是性能 - 您必须在生产环境中对其进行分析,那么就没有办法告诉它“它会更快或更快”。
答案 1 :(得分:2)
排序答案在写入方面没有显着的性能差异
这是我用于测试它的代码,使用pymongo驱动程序结果:
docdict=dict(zip (["key" + str(i) for i in range (1,101)],[ "a"*i for i in range(1,101)])) docstr=str(docdict) def addIdtoStr(s,id):return {'_id':id,'payload':s} def addIdtoDict(d,id): d.update({'_id':id});return d cProfile.run("for i in range(0,100000):x=dbcl.client.tests.test2.insert(addIdtoDict(docdict,i),w=0,j=0)") **12301152 function calls (12301128 primitive calls) in 56.089 second** dbcl.client.tests.test2.remove({},multi= True) cProfile.run("for i in range(0,100000):x=dbcl.client.tests.test2.insert(addIdStr(docstr,i),w=0,j=0)") **12201194 function calls (12115631 primitive calls) in 54.665 seconds**
答案 2 :(得分:0)
MongoDB是一个BSON文档存储,而不是JSON文档存储。 MongoDB无法直接查询JSON。
这是你的想法中的一个根本缺陷,如果你希望以高性能方式查询该文档中的任何东西,可以使用索引等,你会希望将它存储为BSON文档而不是BSON中的JSON字符串文档。
但是如果你要使用:
{
"key_1": "Value1",
"key_2": "Value2",
"external_data": '{"large":{"data":["comes","here"]}}'
}
你只需要查询key_1
和key_2
你实际上可以发现JSON不仅在这里更加空间保守,而且更容易存储,是一个字符串(只要有在该字段上没有索引。)