有没有一种方法可以标准化 mongosh 的 JSON 输出?

3
MongoDB升级了它们的命令行界面(之前是mongo,现在是mongosh)。以前,mongo命令输出的是合适的JSON格式,可以被jq处理。例如:
{ "abc" : "hello" }

新的 mongosh 命令现在输出以下内容:
{ abc: 'hello' }

有些内容无法被 jq 解析。

是否有一种方法可以使 mongosh 输出标准的 JSON?

如果没有,是否有任何 shell 命令可以过滤“不正确但连贯”的 JSON(从 stdin),并将其标准化为标准形式(到 stdout)?


1
尝试使用JSON.stringifyEJSON.stringify - Wernfried Domscheit
你会用jq做什么?我问这个问题是因为你可以直接在mongosh中完成所有操作 - 真的是一切,mongosh是一个完整的Node.js shell。 - Wernfried Domscheit
3个回答

1
一位MongoDB员工建议使用EJSON.stringify包装器,例如:
$ mongosh [...] --eval "EJSON.stringify(db.adminCommand('listDatabases'))"

除了像Long(_)Date(_)这样的扩展之外,看起来hjson也可以使用。

1
你可以在 mongosh 控制台中使用 EJSON.stringify 包装你的查询。 例如:如果你想运行查询 db.books.find({"book-id":"123456789"}),请执行以下操作。
EJSON.stringify(db.books.find({"book-id":"123456789"}).toArray(), null, 2, { relaxed: false })

0

原则上,您可以使用JSON.stringify()。但是它有一些限制,请参考以下示例:

x = {
  a: 1,
  b: ISODate("2022-03-26T11:15:53.750Z"),
  c: Int32(1),
  d: Long("1"),
  e: Long("2"),
  f: Decimal128("-7.6E+11"),
  g: 1.345,
  h: 2,
  t: 'foo'
}

JSON.stringify(x, null, " ")
{
 "a": 1,
 "b": "2022-03-26T11:15:53.750Z",
 "c": 1,
 "d": {
  "low": 1,
  "high": 0,
  "unsigned": false
 },
 "e": {
  "low": 2,
  "high": 0,
  "unsigned": false
 },
 "f": {
  "$numberDecimal": "-7.6E+11"
 },
 "g": 1.345,
 "h": 2,
 "t": "foo"
}

Date对象被转换为字符串。

另一种选择是使用EJSON.stringify(),它可以识别像Date这样的数据类型。在文档中也提到了它:

EJSON具有内置的格式选项,可能可以消除像jq这样的解析器的需要。

然而,这些值将被打印为{"$date": "2022-03-26T11:15:53.750Z"}

EJSON.stringify(x, null, " ")
{
 "a": 1,
 "b": {
  "$date": "2022-03-26T11:15:53.750Z"
 },
 "c": 1,
 "d": 1,
 "e": 2,
 "f": {
  "$numberDecimal": "-7.6E+11"
 },
 "g": 1.345,
 "h": 2,
 "t": "foo"
}

我的解决方案是一个定制函数。在 mongosh 中,tojsontojsononeline 已经不存在了,所以我自己创建了一个:

if (typeof tojsononeline == 'undefined') {
   function tojsononeline(x) {
      return EJSON.stringify(x)
         .replace(/\{"\$date":"(.{19,23}Z)"\}/g, "ISODate(\"$1\")")
         .replace(/\{"\$oid":"(\w{24})"\}/g, "ObjectId(\"$1\")")
         .replace(/\{"\$numberDecimal":"(.+?)"\}/g, "Decimal128(\"$1\")");
   }
}

tojsononeline(x)
{"a":1,"b":ISODate("2022-03-26T11:22:08.029Z"),"c":1,"d":1,"e":2,"f":Decimal128("-7.6E+11"),"g":1.345,"h":2,"t":"foo"}

MongoDB中使用了一些其他的数据类型,但我认为它们几乎没有什么关联。否则可以添加更多的replace()操作。

另一个解决方案是安装"mongosh snippet",可以使用snippet install mongocompat或从https://github.com/mongodb-labs/mongosh-snippets/tree/main/snippets/mongocompat下载脚本并运行。

load('mongonative.js');
load('mongoassert.js');
load('mongotypes.js');

最好将这3行代码放在你的.mongoshrc.js文件中。

这3个脚本定义了(几乎)所有来自旧版mongo shell的函数,这些函数在新版mongosh中尚不可用。

请注意,当您切换到新版mongosh时,您的应用程序可能会面临一些差异,例如 mongosh数据类型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接