【问题标题】:MongoDb Compass export db ref as embedded JSONMongoDb Compass 将数据库引用导出为嵌入式 JSON
【发布时间】:2020-09-04 14:36:01
【问题描述】:

有没有办法导出一个集合,其中所有 DBRef 对象都嵌入在一个 JSON 中?

我尝试从 compass 导出集合,但它没有将 dbrefs 解析为嵌入的 json。


数据结构示例:

流程:

{
    "_id": {
        "$oid": "5f44e89aa1f4c77447629a29"
    },
    "name": "test process",
    "description": "A test configuration for a process",
    "milestones": [{
        "$ref": "milestone",
        "$id": {
            "$oid": "5f5753636b75033a49b7cc7b"
        }
    }, {
        "$ref": "milestone",
        "$id": {
            "$oid": "5f5753636b75033a49b7cc82"
        }
    }]
}

里程碑:

[{
  "_id": {
    "$oid": "5f5753636b75033a49b7cc7b"
  },
  "name": "S1",
  "order": 0,
  "results": [
    {
      "$ref": "resultDefinition",
      "$id": {
        "$oid": "5f5753636b75033a49b7cc79"
      }
    },
    {
      "$ref": "resultDefinition",
      "$id": {
        "$oid": "5f5753636b75033a49b7cc7a"
      }
    }
  ]
},{
  "_id": {
    "$oid": "5f5753636b75033a49b7cc82"
  },
  "name": "S2",
  "order": 1,
  "results": [
    {
      "$ref": "resultDefinition",
      "$id": {
        "$oid": "5f5753636b75033a49b7cc7d"
      }
    },
    {
      "$ref": "resultDefinition",
      "$id": {
        "$oid": "5f5753636b75033a49b7cc7e"
      }
    },
    {
      "$ref": "resultDefinition",
      "$id": {
        "$oid": "5f5753636b75033a49b7cc7f"
      }
    },
    {
      "$ref": "resultDefinition",
      "$id": {
        "$oid": "5f5753636b75033a49b7cc80"
      }
    },
    {
      "$ref": "resultDefinition",
      "$id": {
        "$oid": "5f5753636b75033a49b7cc81"
      }
    }
  ]
}]

阶段:

{
    "_id": {
        "$oid": "5f5753636b75033a49b7cc7c"
    },
    "name": "P1",
    "activityStream": {
        "$ref": "activityStream",
        "$id": {
            "$oid": "5f5755076b75033a49b7cc83"
        }
    }
}

结果定义:

[{
  "_id": {
    "$oid": "5f5753636b75033a49b7cc79"
  },
  "name": "userresult",
  "resultType": "User"
},{
  "_id": {
    "$oid": "5f5753636b75033a49b7cc7a"
  },
  "name": "planDateResult",
  "resultType": "PlanDate"
},{
  "_id": {
    "$oid": "5f5753636b75033a49b7cc7d"
  },
  "name": "fileResult",
  "resultType": "File"
},{
  "_id": {
    "$oid": "5f5753636b75033a49b7cc7e"
  },
  "name": "dateResult",
  "resultType": "Date"
},{
  "_id": {
    "$oid": "5f5753636b75033a49b7cc7f"
  },
  "name": "textresult",
  "resultType": "Text"
},{
  "_id": {
    "$oid": "5f5753636b75033a49b7cc80"
  },
  "name": "booleanResult",
  "resultType": "Boolean"
},{
  "_id": {
    "$oid": "5f5753636b75033a49b7cc81"
  },
  "name": "numberResult",
  "resultType": "Number"
}]

关系:

流程可以有 n 个里程碑。里程碑有一个或没有阶段。 Phase 有更多的嵌套路径,但与示例无关。里程碑可以有 n 个 ResultDefinitions

【问题讨论】:

  • 您可以使用查找和$out 进行聚合查询,所有结果都生成一个集合,然后您可以导出该集合。
  • 这会递归工作吗?假设我有嵌套引用 foo -> bar --> foobar 从 foo 到 bar 的关系是 1:n
  • 是的,这将起作用,嵌套引用也将起作用,但取决于数据,您可以在单个查询中使用引用 ID 查找集合,只需测试它花费了多少时间。
  • 好的,你能提供所有集合或文档结构的架构吗,所以我会测试和更新你。
  • 表示字段和关系的示例。或所有集合的 json 文档示例,为所有集合仅添加单个文档,以便我可以了解彼此的关系字段,并进行单个查询。

标签: mongodb spring-data-mongodb mongodb-compass


【解决方案1】:

您可以进行聚合查询并使用$out运算符,这会将查询结果复制到单独的集合中,您可以根据需要修改查询,看到最后一个阶段是$out: <collection name>,只需提供集合的名称并执行此查询,这将复制该集合中的结果,您可以导出该集合。

db.process.aggregate([
  { $unwind: "$milestones" },
  {
    $lookup: {
      from: "milestone",
      let: { id: "$milestones.$id" },
      pipeline: [
        { $match: { $expr: { $eq: ["$$id", "$_id"] } } },
        { $unwind: "$results" },
        {
          $lookup: {
            from: "resultDefinition",
            localField: "results.$id",
            foreignField: "_id",
            as: "results"
          }
        },
        { $unwind: "$results" },
        {
          $group: {
            _id: "$_id",
            name: { $first: "$name" },
            order: { $first: "$order" },
            results: { $push: "$results" }
          }
        }
      ],
      as: "milestones"
    }
  },
  { $unwind: "$milestones" },
  {
    $group: {
      _id: "$_id",
      name: { $first: "$name" },
      description: { $first: "$description" },
      milestones: { $push: "$milestones" }
    }
  },

  // you can specify the name of collection that you want
  { $out: "collection name" }
])

Playground

【讨论】:

  • 谢谢!您是否尝试将其导入指南针? (docs.mongodb.com/compass/master/import-pipeline-from-text) 我试过了(并删除了 db.process.aggregate 和封闭括号),但它说 FieldPath 名称可能不以'$'开头
  • 好的,你的 mongodb 是什么版本?可能是向下版本不支持,将为您提供另一种选择。
  • 你可以试试这个Playground
  • 我很抱歉这个问题,这是因为字段的名称是milestones.$id,从$开始,他们在4.4版本中更正了,你可以尝试升级你的指南针吗来自link 的版本或在您可以尝试此playground 之前刚刚更新了一个管道,这可能会起作用。或者尝试在 mongo shell 中执行查询,他们还提供了mongo shell
  • 很抱歉,mongo 社区方面可能存在关于没有扩展的问题,您可以向 mongo 开发者论坛发布有关扩展的问题,或者我会问他们,看看这个i.stack.imgur.com/ijTlX.png ,在 compass 1.21.2 和 mongodb 4.4 中执行的相同数据和查询,它的工作,可能在 4.4 中已更正。如果我能得到一些解决方案,会更新你。
【解决方案2】:

您还可以通过此命令以 JSON 格式导出 Mongo 集合,

mongoexport -d <db-name> -c <collection-name> --out <collection-name>.json

【讨论】:

  • 这是否将参考集合文档合并到单个集合中?
  • 仅适用于 JSON 中的单个集合导出。
  • OP 希望使用参考 ID 将参考集合文档加入单个集合中。和你类似的答案已经是here了,不用再回答了。
  • 参考文档有一种解决方案。运行您的查询,然后 --out 生成新集合。 & 然后你可以试试这个导出 JSON 命令。
  • 是的,我向他建议的,问题不在于出口。他可以点击指南针中的按钮导出。
猜你喜欢
  • 1970-01-01
  • 2019-01-22
  • 2021-07-23
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
相关资源
最近更新 更多