Mongodb dump(过滤文档和字段)

2024-01-23

我想做一个partialMongodb 数据库的转储(partial比如,我需要过滤一些文件还有一些fields)。然后,该转储将被导入到另一台服务器上。

我无法使用蒙戈转储实用程序,因为它不允许过滤字段。
我可以使用蒙戈出口公司实用程序,因为它允许过滤文档和字段。不过,文档指出蒙戈出口公司只能输出 JSON 文件并且:

不能可靠地保留所有丰富的 BSON 数据类型,因为 JSON 只能表示 BSON 支持的类型的子集。

  1. 我觉得这个说法有点含糊,不太明白。那么,如果我将数据库转储为 JSON 会发生什么?我面临哪些风险?我是否有丢失某些文件的风险?
  2. 如果你认为我绝对应该避免使用蒙戈出口公司在生产中,我可以编写自己的 Nodejs 应用程序来执行过滤并在 BSON 中输出转储吗?或者说那是不可能的?

可以使用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确实符合要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongodb dump(过滤文档和字段) 的相关文章

随机推荐