Ошибка синтаксического анализа JSON mongoexport - PullRequest
3 голосов
/ 11 ноября 2011

Попытка использовать запрос с mongoexport приводит к ошибке.Но тот же запрос оценивается монго-клиентом без ошибки.

В монго-клиенте:

db.listing.find({"created_at":new Date(1221029382*1000)})

с монгоэкспортом:

mongoexport -d event -c listing -q '{"created_at":new Date(1221029382*1000)}'

Сгенерированная ошибка:

Fri Nov 11 17:44:08 Assertion: 10340:Failure parsing JSON string near: 
$and: [ { 
0x584102 0x528454 0x5287ce 0xa94ad1 0xa8e2ed 0xa92282 0x7fbd056a61c4 
0x4fca29 
mongoexport(_ZN5mongo11msgassertedEiPKc+0x112) [0x584102] 
mongoexport(_ZN5mongo8fromjsonEPKcPi+0x444) [0x528454] 
mongoexport(_ZN5mongo8fromjsonERKSs+0xe) [0x5287ce] 
mongoexport(_ZN6Export3runEv+0x7b1) [0xa94ad1] 
mongoexport(_ZN5mongo4Tool4mainEiPPc+0x169d) [0xa8e2ed] 
mongoexport(main+0x32) [0xa92282] 
/lib/libc.so.6(__libc_start_main+0xf4) [0x7fbd056a61c4] 
mongoexport(__gxx_personality_v0+0x3d9) [0x4fca29] 
assertion: 10340 Failure parsing JSON string near: $and: [ {

Но умножение в Date заранее в mongoexport:

mongoexport -d event -c listing -q '{"created_at":new Date(1221029382000)}'

работает!

Почему Монго по-разному оценивает запросы в этих двух контекстах

Ответы [ 2 ]

8 голосов
/ 05 августа 2012

Утилита командной строки mongoexport поддерживает передачу запроса в формате JSON , но вы пытаетесь оценить JavaScript в вашем запросе.

Формат JSON изначально был получен из нотации объектов JavaScript, но содержимое документа JSON может быть проанализировано без eval() его интерпретации в интерпретаторе JavaScript.

Вам следуетрассматривайте JSON как " структурированные данные ", а JavaScript как " исполняемый код ".Таким образом, на самом деле существуют два разных контекста для выполняемых вами запросов.

Утилита командной строки mongo представляет собой интерактивную оболочку JavaScript , которая включает в себя интерпретатор JavaScript, а такженекоторые вспомогательные функции для работы с MongoDB.Хотя формат объектов JavaScript выглядит аналогично JSON, вы также можете использовать объекты JavaScript, вызовы функций и операторы.

Ваш пример 1221029382*1000 является результатом математической операции, которая будет выполняться интерпретатором JavaScript.если вы запустили это в оболочке mongo;в JSON это недопустимое значение для новой даты, поэтому mongoexport завершает работу с ошибкой «Ошибка разбора строки JSON».

0 голосов
/ 29 марта 2013

Я также получил эту ошибку, делая mongoexport, но по другой причине. Я поделюсь своим решением здесь, так как я попал на эту страницу SO, пытаясь решить мою проблему.

Я знаю, что это не имеет ничего общего с этим вопросом, но название этого поста подняло его в Google, поэтому, поскольку я получаю точно такую ​​же ошибку, я добавлю ответ. Надеюсь, это кому-нибудь поможет.

Я пытался выполнить запрос MongoId _id в консоли Windows. Проблема заключалась в том, что мне нужно было обернуть JSON-запрос в двойные кавычки, а ObjectId также должен был быть в двойных кавычках (а не в одинарных!). Поэтому мне пришлось избежать кавычек ObjectId.

mongoexport -u ИМЯ ПОЛЬЗОВАТЕЛЯ -pPASSWORD -d БАЗА ДАННЫХ -c КОЛЛЕКЦИЯ --query "{_id: ObjectId (\" 5148894d98981be01e000011 \ ")}"

Если в Windows заключить JSON-запрос в одинарные кавычки, я получу эту ошибку:

ERROR: too many positional options

И если я использую одинарные кавычки вокруг ObjectId, я получаю эту ошибку:

Assertion: 10340:Failure parsing JSON string near: _id

Итак, да. Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...