Ошибка синтаксического анализа 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

Так что да. Удачи.

Другие вопросы по тегам