MongoDb Compass 将 db ref 导出为嵌入式 JSON

MongoDb Compass export db ref as embedded JSON

有没有办法将所有 DBRef 对象嵌入单个 JSON 中的集合导出?

我试图从罗盘导出集合,但它没有将 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 个里程碑。里程碑有一个或没有阶段。阶段有更多的嵌套路径,但与示例无关。里程碑可以有 n 个 ResultDefinitions

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

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

您可以进行聚合查询并使用 $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