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

7gyucuyw  于 2023-03-01  发布在  Go
关注(0)|答案(3)|浏览(119)

MongoDB升级了他们的命令行接口(以前是 * mongo *,现在是 * mongosh ),以前, mongo * 命令输出是正确的JSON格式,这种格式 * jq * 可以接收。
例如:

{ "abc" : "hello" }

新的 * mongosh * 命令现在输出如下内容:

{ abc: 'hello' }

...无法由 * jq * 解析。
有没有一种方法可以标准化 * mongosh * 以输出标准JSON?
如果没有,是否有任何shell命令可以过滤"不正确但一致"的JSON(来自stdin)并将其规范化为标准格式(到stdout)?

smtd7mpg

smtd7mpg1#

MongoDB的一位员工推荐使用EJSON.stringify Package 器,例如:

$ mongosh [...] --eval "EJSON.stringify(db.adminCommand('listDatabases'))"

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

68bkxrlz

68bkxrlz2#

原则上可以使用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"
}

我的解决方案是定制函数。tojsontojsononelinemongosh中不再存在,所以我创建了自己的:

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 Data Types

7gcisfzg

7gcisfzg3#

您可以从mongosh控制台内部将查询 Package 到EJSON.stringify内部。例如:如果您想运行查询db.books.find({"book-id":"123456789"}),请执行以下命令。

EJSON.stringify(db.books.find({"book-id":"123456789"}).toArray(), null, 2, { relaxed: false })

相关问题