Ошибка синтаксического анализа JSON mongoexport
Попытка использовать запрос с 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 -d event -c listing -q '{"created_at":new Date(1221029382000)}'
работает!
Почему Монго оценивает запросы по-разному в этих двух контекстах?
2 ответа
mongoexport
Утилита командной строки поддерживает передачу запроса в формате JSON, но вы пытаетесь оценить JavaScript в своем запросе.
Формат JSON изначально был получен из объектной нотации JavaScript, но содержимое документа JSON может быть проанализировано без eval()
в интерпретаторе JavaScript.
JSON следует рассматривать как представление "структурированных данных", а JavaScript - как "исполняемый код". Таким образом, на самом деле есть два разных контекста для запросов, которые вы выполняете.
mongo
Утилита командной строки - это интерактивная оболочка JavaScript, которая включает в себя интерпретатор JavaScript, а также некоторые вспомогательные функции для работы с MongoDB. Хотя формат объектов JavaScript похож на JSON, вы также можете использовать объекты JavaScript, вызовы функций и операторы.
Ваш пример 1221029382*1000
является результатом математической операции, которая будет выполняться интерпретатором JavaScript, если вы запустили ее в mongo
ракушка; в JSON это недопустимое значение для новой даты, поэтому mongoexport завершает работу с ошибкой "Ошибка разбора строки JSON".
Я также получил эту ошибку, делая mongoexport
, но по другой причине. Я поделюсь своим решением здесь, так как я попал на эту страницу SO, пытаясь решить мою проблему.
Я знаю, что это не имеет никакого отношения к этому вопросу, но название этого поста подняло его в Google, поэтому, поскольку я получаю точно такую же ошибку, я добавлю ответ. Надеюсь, это кому-нибудь поможет.
Я пытался сделать MongoId _id
запрос в консоли Windows. Проблема заключалась в том, что мне нужно было заключить JSON-запрос в двойные кавычки, а ObjectId также должен был быть в двойных кавычках (а не в одинарных!). Таким образом, я должен был избежать кавычек ObjectId.
mongoexport -u ИМЯ-ПОЛЬЗОВАТЕЛЯ -pPASSWORD -d БАЗА ДАННЫХ -c КОЛЛЕКЦИЯ --query "{_id: ObjectId(\"5148894d98981be01e000011\")}"
Если я заключаю JSON-запрос в одинарные кавычки в Windows, я получаю эту ошибку:
ERROR: too many positional options
И если я использую одинарные кавычки вокруг ObjectId, я получаю эту ошибку:
Assertion: 10340:Failure parsing JSON string near: _id
Так что да. Удачи.