原则上,您可以使用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
中,tojson
和 tojsononeline
已经不存在了,所以我自己创建了一个:
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数据类型。
JSON.stringify
或EJSON.stringify
。 - Wernfried Domscheit