Подтвердить что ты не робот

Force mongodb выводит строгий JSON

Я хочу использовать необработанный вывод некоторых команд MongoDB в других программах, которые говорят JSON. Когда я запускаю команды в оболочке mongo, они представляют Extended JSON, поля в режиме оболочки, со специальными полями, такими как NumberLong, Date и Timestamp. Я вижу ссылки в документации на "строгий режим", но я не вижу возможности включить его для оболочки или способ запускать команды типа db.serverStatus() в вещах, которые выводят строгий JSON, например mongodump. Как заставить Mongo выпустить совместимый с JSON стандарт?

Есть несколько другие questions по этой теме, но я не нахожу их ответы особенно удовлетворительными.

4b9b3361

Ответ 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