Force mongodb выводит строгий JSON
Я хочу использовать необработанный вывод некоторых команд MongoDB в других программах, которые говорят JSON. Когда я запускаю команды в оболочке mongo, они представляют Extended JSON, поля в режиме оболочки, со специальными полями, такими как NumberLong
, Date
и Timestamp
. Я вижу ссылки в документации на "строгий режим", но я не вижу возможности включить его для оболочки или способ запускать команды типа db.serverStatus()
в вещах, которые выводят строгий JSON, например mongodump
. Как заставить Mongo выпустить совместимый с JSON стандарт?
Есть несколько другие questions по этой теме, но я не нахожу их ответы особенно удовлетворительными.
Ответы
Ответ 1
Оболочка MongoDB говорит Javascript, поэтому ответ прост: используйте JSON.stringify()
. Если ваша команда db.serverStatus()
, вы можете просто сделать это:
JSON.stringify(db.serverStatus())
Это не выведет правильное представление "строгого режима" для каждого из полей ({ "floatApprox": <number> }
вместо { "$numberLong": "<number>" }
), но если вы заботитесь о том, чтобы получить доступ к стандартам JSON, это сделает трюк.
Ответ 2
Я не нашел способ сделать это в оболочке mongo, но в качестве обходного пути mongoexport
может запускать запросы, а его вывод использует строгий режим и может быть передан в другие команды, ожидающие ввода JSON (например, json_pp
или jq
). Например, предположим, что для выполнения запроса используется следующая команда оболочки mongo, и вы хотите создать конвейер, используя эти данные:
db.myItemsCollection.find({creationDate: {$gte: ISODate("2016-09-29")}}).pretty()
Преобразуйте эту команду оболочки mongo в эту команду оболочки, для удобства используйте команду json_pp:
mongoexport --jsonArray -d myDbName -c myItemsCollection -q '{"creationDate": {"$gte": {"$date": "2016-09-29T00:00Z"}}}' | json_pp
Вам нужно будет преобразовать запрос в формат строгого режима и передать имя базы данных и имя коллекции в качестве аргументов, а также правильно указать для вашей оболочки, как показано здесь.
Ответ 3
Чтобы основываться на ответе от @jbyler, вы можете лишить номерLongs с помощью sed после получения ваших данных - это если вы используете linux.
mongoexport --jsonArray -d dbName -c collection -q '{fieldName: {$regex: ".*turkey.*"}}' | sed -r 's/\{ "[$]numberLong" : "([0-9]+)" }/"\1"/g' | json_pp