1

我有大量的 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"]}}'
}
4

3 回答 3

2

我相信将数据存储在 BSON 中既能提高性能又能节省空间。这样你就可以在未来“投资”:如果你现在将数据存储为 BSON,那么如果出现这样的要求,以后就可以对它进行 db-query。

但是无论如何,如果您关心的是性能 - 您确实必须在生产环境中对其进行分析,没有办法说“它会更快与否”。

于 2013-02-13T14:08:36.617 回答
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 次函数调用(12301128 次原始调用)在 56.089 秒内**
    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 次函数调用(12115631 次原始调用)在 54.665 秒内**

于 2013-02-13T15:57:48.860 回答
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 不仅在这里更节省空间,而且更易于存储,它是一个字符串(只要该字段上没有索引)。

于 2013-02-13T15:59:38.703 回答