Docs 菜单
Docs 主页
/ /

$deserializeEJSON(表达式操作符)

$deserializeEJSON

8.3版本新增

将扩展JSON (EJSON) 格式转换为本原生BSON值。在使用 解析JSON字符串后,您可以使用此表达式将EJSON类型包装器转换为其相应的BSON$convert 类型。

{
$deserializeEJSON: {
input: <expression>,
onError: <expression>
}
}

$deserializeEJSON 接受包含以下字段的文档:

字段
类型
必要性
说明

input

表达式(expression)

必需

要转换为原生BSON格式的扩展JSON值。这应该是包含EJSON类型包装器的BSON文档。

onError

表达式(expression)

Optional

如果操作在转换期间遇到错误,则返回该值。

如果未指定,则在发生错误时,操作会引发错误并停止。

$deserializeEJSON 将扩展JSON类型包装器转换为其相应的BSON 类型:

扩展JSON类型包装器
BSON 类型
例子

{"$numberInt": "42"}

Int32

42

{"$numberLong": "42"}

Int64

NumberLong(42)

{"$numberDouble": "42.5"}

double

42.5

{"$oid": "507f1f77bcf86cd799439011"}

ObjectId

ObjectId("507f1f77bcf86cd799439011")

{"$date": "2021-01-01T00:00:00.000Z"}

Date

ISODate("2021-01-01T00:00:00.000Z")

{"$date": {"$numberLong": "1609459200000"}}

Date

ISODate("2021-01-01T00:00:00.000Z")

{"$binary": {"base64": "AQIDBA==", "subType": "00"}}

二进制文件

BinData(0, "AQIDBA==")

{"$regularExpression": {"pattern": "abc", "options": "i"}}

正则表达式

/abc/i

如果 input 值为 null 或缺失,则 $deserializeEJSON 返回 null。

本页上的示例使用 sample_mflix示例数据集 的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。

以下示例将扩展JSON 文档反序列化回原生BSON 类型:

db.movies.aggregate([
{
$match: { title: "Inception" }
},
{
$project: {
original: "$$ROOT",
serialized: { $serializeEJSON: { input: "$$ROOT" } }
}
},
{
$project: {
title: "$original.title",
deserialized: { $deserializeEJSON: { input: "$serialized" } }
}
}
])
{
_id: ObjectId("573a1398f29313caabcea974"),
title: "Inception",
deserialized: {
_id: ObjectId("573a1398f29313caabcea974"),
title: "Inception",
year: 2010,
runtime: 148,
released: ISODate("2010-07-16T00:00:00.000Z"),
cast: [
"Leonardo DiCaprio",
"Joseph Gordon-Levitt",
"Ellen Page",
"Tom Hardy"
],
genres: [ "Action", "Sci-Fi", "Thriller" ],
directors: [ "Christopher Nolan" ]
}
}

以下示例将$convert$deserializeEJSON 结合使用以解析JSON字符串并将EJSON类型包装器转换为BSON:

db.aggregate([
{
$documents: [
{
jsonData: '{"_id":{"$oid":"507f1f77bcf86cd799439011"},' +
'"title":"The Matrix",' +
'"year":{"$numberInt":"1999"},' +
'"rating":{"$numberDouble":"8.7"}}'
}
]
},
{
$project: {
parsed: {
$convert: {
input: "$jsonData",
to: "object"
}
}
}
},
{
$project: {
movie: { $deserializeEJSON: { input: "$parsed" } }
}
}
])
{
_id: ObjectId("..."),
movie: {
_id: ObjectId("507f1f77bcf86cd799439011"),
title: "The Matrix",
year: 1999,
rating: 8.7
}
}

您可以反序列化包含EJSON类型包装器的特定字段:

db.movies.aggregate([
{
$match: { title: "Inception" }
},
{
$project: {
title: 1,
serializedMetadata: {
$serializeEJSON: {
input: {
releaseDate: "$released",
runtime: "$runtime",
rating: "$imdb.rating"
}
}
}
}
},
{
$project: {
title: 1,
metadata: { $deserializeEJSON: { input: "$serializedMetadata" } }
}
}
])
{
_id: ObjectId("573a1398f29313caabcea974"),
title: "Inception",
metadata: {
releaseDate: ISODate("2010-07-16T00:00:00.000Z"),
runtime: 148,
rating: 8.8
}
}

以下示例使用 onError 在反序列化失败时提供回退值:

db.data.aggregate([
{
$project: {
result: {
$deserializeEJSON: {
input: "$ejsonField",
onError: { error: "Invalid EJSON format" }
}
}
}
}
])

后退

$derivative

在此页面上