可以使用Views https://docs.mongodb.com/manual/core/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,您可以从中访问视图mongodump https://docs.mongodb.com/manual/reference/program/mongodump/使用--viewsAsCollections https://docs.mongodb.com/manual/reference/program/mongodump/#cmdoption-mongodump-viewsascollections option:
mongodump --db test --collection testView --viewsAsCollections
这仅导出命名的“收藏”(实际上是一个视图)而已。这--viewsAsCollections https://docs.mongodb.com/manual/reference/program/mongodump/#cmdoption-mongodump-viewsascollections意味着代替mongodump https://docs.mongodb.com/manual/reference/program/mongodump/只需返回视图定义(本质上是聚合管道),它就会返回结果,就像它是一个真正的集合一样。
然后可以通过以下方式加载生成的 BSON 内容mongorestore https://docs.mongodb.com/manual/reference/program/mongorestore/:
mongorestore --db other --collection test
然后,BSON 转储中的内容实际上会写入您要连接的主机的新数据库目标并具有指定的集合名称
use other
db.test.find()
{ "_id" : ObjectId("5bfb3e0eadd1d8af906ad140"), "a" : 1, "b" : 2 }
还注意到,作为View https://docs.mongodb.com/manual/core/views/,聚合管道实际上可以是任何东西,所以$match
语句可以过滤,您可以根据需要进行转换甚至“聚合”。
使用视图或--fields
with mongoexport
以大致相同的方式,mongoexport https://docs.mongodb.com/manual/reference/program/mongoexport/实用程序还可以从视图访问内容。
尽管这不是“严格的BSON”,实际上 MongoDB 有一个标准,它实际上是preserve数据类型。这实际上包含在下面的文档中MongoDB 扩展 JSON https://docs.mongodb.com/manual/reference/mongodb-extended-json/.
所以这不是二进制格式,作为 JSON,它确实需要更多的存储空间,但必要的信息确实存在。
例如:
db.mixed.insert({
"a": NumberLong(1),
"b": NumberDecimal("123.45"),
"c": new Date(),
"d": "unwanted"
})
哪个会出现在mongo
外壳为:
{
"_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 https://docs.mongodb.com/manual/reference/program/mongoexport/#cmdoption-mongoexport-fields供选择:
mongoexport --db test --collection mixed --fields a,b,c > out.json
具有完全相同的输出。唯一的限制是--query https://docs.mongodb.com/manual/reference/program/mongoexport/#cmdoption-mongoexport-query只能支持正则查询表达式find()
或类似的。这不像View https://docs.mongodb.com/manual/core/views/,但可以针对大多数需求进行基本过滤。
The 扩展 JSON https://docs.mongodb.com/manual/reference/mongodb-extended-json/格式被识别为mongoimport https://docs.mongodb.com/manual/reference/program/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")
}
所以这是可能的并且扩展 JSON https://docs.mongodb.com/manual/reference/mongodb-extended-json/格式的存在是为了在发送的情况下进行数据交换binary内容可能不可行,甚至不理想,但保持"type"信息是可取的.
总体而言,您可以使用许多选项,而无需恢复为读写二进制 BSON 格式或任何其他复杂的二进制格式来在传输之间存储数据。
作为注释"vague"段落中,实际支持的 BSON 类型列在扩展 JSON https://docs.mongodb.com/manual/reference/mongodb-extended-json/文档的页面。您甚至可以将其与BSON规范 http://bsonspec.org/spec.html看到尽管“谨慎”声明common您真正要使用的数据类型实际上都受支持。同时some该规范的外部解释可能不符合理解ALL其中,捆绑的实用程序例如mongoexport
and mongoimport
确实符合要求。