草庐IT

Mongodb dump(过滤文档和字段)

coder 2023-11-02 原文

我想对 Mongodb 数据库进行部分转储(部分转储,我需要过滤一些 文档 和一些 字段 )。然后,此转储将导入到另一台服务器上。

我不能使用 mongodump 实用程序,因为它不允许过滤字段。
我可以使用 mongoexport 实用程序,因为它允许过滤文档和字段。但是,文档指出 mongoexport 只能输出 JSON 文件并且:

does not reliably preserve all rich BSON data types, because JSON can only represent a subset of the types supported by BSON.


  • 我觉得这个说法有点含糊,我不完全理解。那么,如果我用 JSON 转储我的数据库会发生什么?我要冒什么风险?我会冒丢失某些文件的风险吗?
  • 如果您认为我绝对应该避免在生产中使用 mongoexport,我可以编写自己的 Nodejs 应用程序来进行过滤并在 BSON 中输出转储吗?或者那是不可能的?
  • 最佳答案

    可以使用 Views无需求助于编写读取和编写 BSON 内容的低级实现。即使使用 JSON 格式,也有一些选项实际上会保留类型,您甚至不需要“ View ”。

    mongodump 一起使用 View

    基本前提是创建一个只返回你想要的内容的 View 。 View 可以是任何聚合管道表达式的结果。

    例如,给定一个集合中的简单文档:

    db.test.insert({ "a": 1, "b": 2, "c": 3 })
    

    您可以在该集合上创建 View ,只需要字段:
    db.test.createView("testView", "test", [{ "$project": { "a": 1, "b": 2 } }])
    

    然后退出 mongo shell,您可以从 mongodump 访问 View 使用 --viewsAsCollections 选项:
    mongodump --db test --collection testView --viewsAsCollections
    

    这仅导出命名的“集合”(实际上是一个 View )。 --viewsAsCollections 意味着代替 mongodump 只是返回 View 定义(本质上是聚合管道)它返回结果而不是就像它是一个真正的集合。

    然后可以通过 mongorestore 加载生成的 BSON 内容。 :
    mongorestore --db other --collection test
    

    然后来自 BSON 转储的内容实际上被写入您正在连接的主机的新数据库目标中,并具有指定的集合名称
    use other
    db.test.find()
    
    { "_id" : ObjectId("5bfb3e0eadd1d8af906ad140"), "a" : 1, "b" : 2 }
    

    还注意到作为 View ,聚合管道真的可以是任何东西,所以 $match语句可以过滤,您可以根据需要转换甚至实际“聚合”。

    使用 View 或 --fieldsmongoexport
    以同样的方式, mongoexport 实用程序还可以从 View 访问内容。

    尽管这不是“严格的 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"
    }
    

    您仍然可以设置 View :
    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 识别并且还有许多语言的解析器实现也可以识别这一点,并且在读取内容时将其插入到目标集合中,并保留“类型”信息:
    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 进行比较。看到尽管有“谨慎”声明,但您确实会使用的常见数据类型实际上都得到了支持。虽然对该规范的一些外部解释可能无法理解所有这些,但捆绑的实用程序如 mongoexportmongoimport确实是合规的。

    关于Mongodb dump(过滤文档和字段),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53473151/

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

    1. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

      我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

    2. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

      我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

    3. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

      我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

    4. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

      是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

    5. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

      matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

    6. ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数) - 2

      我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告

    7. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

      我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

    8. ruby-on-rails - Sphinx - 何时对字段使用 'has' 和 'indexes' - 2

      我几天前在我的ruby​​onrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag

    9. Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题? - 2

      假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案

    10. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

      我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

    随机推荐