定义
$deserializeEJSON8.3版本新增。
将扩展JSON (EJSON) 格式转换为本原生BSON值。在使用 解析JSON字符串后,您可以使用此表达式将EJSON类型包装器转换为其相应的BSON
$convert类型。
语法
{ $deserializeEJSON: { input: <expression>, onError: <expression> } }
$deserializeEJSON 接受包含以下字段的文档:
字段 | 类型 | 必要性 | 说明 |
|---|---|---|---|
| 表达式(expression) | 必需 | 要转换为原生BSON格式的扩展JSON值。这应该是包含EJSON类型包装器的BSON文档。 |
| 表达式(expression) | Optional | 如果操作在转换期间遇到错误,则返回该值。 如果未指定,则在发生错误时,操作会引发错误并停止。 |
行为
类型包装器解析
$deserializeEJSON 将扩展JSON类型包装器转换为其相应的BSON 类型:
扩展JSON类型包装器 | BSON 类型 | 例子 |
|---|---|---|
| Int32 |
|
| Int64 |
|
| double |
|
| ObjectId |
|
| Date |
|
| Date |
|
| 二进制文件 |
|
| 正则表达式 |
|
Null 和缺失值
如果 input 值为 null 或缺失,则 $deserializeEJSON 返回 null。
示例
本页上的示例使用 sample_mflix示例数据集 的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
反序列化扩展JSON文档
以下示例将扩展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" ] } }
解析JSON字符串并反序列化
以下示例将$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 进行错误处理
以下示例使用 onError 在反序列化失败时提供回退值:
db.data.aggregate([ { $project: { result: { $deserializeEJSON: { input: "$ejsonField", onError: { error: "Invalid EJSON format" } } } } } ])