将大型JSON对象存储为JSON还是字符串?

时间:2013-02-13 14:03:00

标签: json performance mongodb

我有一大堆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"]}}'
}

3 个答案:

答案 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_1key_2你实际上可以发现JSON不仅在这里更加空间保守,而且更容易存储,是一个字符串(只要有在该字段上没有索引。)