可以使用Views 来完成,而无需编写读取和写入 BSON 内容的低级实现。还有一些选项实际上保留类型,即使在使用 JSON 格式时,您甚至不需要“视图”。
使用带有mongodump 的视图
基本前提是创建一个只返回你想要的内容的视图。视图可以是任何聚合管道表达式的结果。
例如,给定一个集合中的简单文档:
db.test.insert({ "a": 1, "b": 2, "c": 3 })
您可以在该集合上创建视图,只需要需要的字段:
db.test.createView("testView", "test", [{ "$project": { "a": 1, "b": 2 } }])
然后退出 mongo shell,您可以使用 --viewsAsCollections 选项从 mongodump 访问视图:
mongodump --db test --collection testView --viewsAsCollections
这仅导出命名的 "collection" (实际上是一个 View )。 --viewsAsCollections 意味着 mongodump 不只是返回视图定义(本质上是聚合管道),而是返回结果,就像它是一个真正的集合一样。
然后可以通过mongorestore 加载生成的 BSON 内容:
mongorestore --db other --collection test
然后来自 BSON 转储的内容实际上被写入您正在连接的主机的新数据库目标中,并具有指定的集合名称
use other
db.test.find()
{ "_id" : ObjectId("5bfb3e0eadd1d8af906ad140"), "a" : 1, "b" : 2 }
还要注意,作为 View,聚合管道实际上可以是任何东西,因此 $match 语句可以过滤,您可以根据需要转换甚至实际“聚合”。
使用视图或 --fields 和 mongoexport
同样,mongoexport 实用程序也可以访问视图中的内容。
尽管这不是“严格的 BSON”,但实际上 MongoDB 有一个标准保留数据类型。这实际上包含在MongoDB extended JSON 下的文档中。
所以这不是二进制格式,作为 JSON,它确实需要更多的存储空间,但确实存在必要的信息。
例如:
db.mixed.insert({
"a": NumberLong(1),
"b": NumberDecimal("123.45"),
"c": new Date(),
"d": "unwanted"
})
在mongo shell 中显示为:
{
"_id" : ObjectId("5bfb428790b2b4e4241a015c"),
"a" : NumberLong(1),
"b" : NumberDecimal("123.45"),
"c" : ISODate("2018-11-26T00:47:03.033Z"),
"d" : "unwanted"
}
您仍然可以设置视图:
db.createView("mixedView", "mixed", [{ "$project": { "a": 1, "b": 1, "c": 1 } }])
而导出只会获取数据:
mongoexport --db test --collection mixedView > out.json
{
"_id": {
"$oid": "5bfb428790b2b4e4241a015c"
},
"a": {
"$numberLong": "1"
},
"b": {
"$numberDecimal": "123.45"
},
"c": {
"$date": "2018-11-26T00:47:03.033Z"
}
}
或者在原来的集合上也一样,只是使用--fields进行选择:
mongoexport --db test --collection mixed --fields a,b,c > out.json
输出完全相同。唯一的限制是--query 只能支持find() 或类似的正则查询表达式。这不如View 灵活,但可以针对大多数需求进行基本过滤。
Extended JSON 格式被 mongoimport 识别,并且还有许多语言的解析器实现也可以识别这一点,并且在读取内容时,它会被插入到带有 的目标集合中type" 保留信息:
mongoimport --db other --collection mixed out.json
然后查看数据:
use other
db.mixed.findOne()
{
"_id" : ObjectId("5bfb428790b2b4e4241a015c"),
"a" : NumberLong(1),
"b" : NumberDecimal("123.45"),
"c" : ISODate("2018-11-26T00:47:03.033Z")
}
因此,Extended JSON 格式的存在是为了在发送 二进制 内容可能不可行甚至不希望但保持 “类型”的情况下进行数据交换信息是可取的。
总体而言,您可以使用许多选项,而无需恢复为读写二进制 BSON 格式或任何其他复杂的二进制格式来存储传输之间的数据。
作为对 “模糊” 段落的注释,实际支持的 BSON 类型列在文档的 Extended JSON 页面中。您甚至可以将其与BSON Specification 进行比较,以发现尽管有 "cautious" 声明,但您确实会使用的 common 类型的数据实际上都支持。虽然一些对该规范的外部解释可能不符合理解所有它们,但捆绑的实用程序,如mongoexport和mongoimport确实是合规的。