2013-02-13 3 views
1

У меня есть большой набор документов JSON, которые я готов хранить в MongoDB.Хранение большого объекта JSON как JSON или как String?

Однако, учитывая, что я ищу и извлекаю только против нескольких полей, мне было интересно, насколько это будет лучше.

Один из вариантов для хранения больших объектов, как 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

Или сохранить его как миниатюрный JSON? – 2013-02-13 14:04:02

+4

JSON _is_ a "string" - это сериализация, как и XML. Если вас беспокоит производительность, ** измерьте. ** –

+0

@MattBall Да ладно, не разбуди его от его приятного сна! : P – 2013-02-13 14:05:38

ответ

2

Я считаю, что хранение данных в BSON одновременно производительности и пространства. И тем самым вы «инвестируете» в будущем: если вы сейчас сохраните данные как BSON, тогда будет возможно выполнить db-запрос позже, если появится такое требование.

Но, в любом случае, если ваша проблема связана с производительностью - вам нужно профилировать ее в производственной среде, нет способа сказать, что «это будет быстрее или нет».

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** 

+0

Ваш тест, atm, зависит от языка. Вы хотите запустить профайлер databse, если хотите, чтобы какая-то надежда на понимание была быстрее. – Sammaye

+1

Уверен, что это зависит от языка и драйвера, но исходный плакат, упомянутый с использованием python, и все же дает достоверную информацию о скорости выполнения и просмотре журналов mongo, подтверждают, что и фактические данные хранятся как фактор, так и конфигурация mongo , поэтому я бы предложил bechmarking, используя фактические данные и драйвер выбора. – nickmilon

0

MongoDB является BSON документ магазин не JSON один. MongoDB не может напрямую запрашивать JSON.

Это фундаментальный недостаток в вашей идее здесь, если вы хотите запросить что-либо в этом документе с помощью инструмента, который может использовать индексы и т. Д., Вы захотите сохранить его как документ BSON, а не как строку JSON в Документ BSON.

Однако, если бы вы использовали:

{ 
    "key_1": "Value1", 
    "key_2": "Value2", 
    "external_data": '{"large":{"data":["comes","here"]}}' 
} 

И только когда нужно будет запрашивать против key_1 и key_2 вы могли бы на самом деле найти, что JSON не только больше пространства консервативны, но и легче хранить, будучи строка (пока в этом поле нет индекса).

Смежные вопросы