MongoDb Compass将数据库引用导出为嵌入式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,"$id": {
        "$oid": "5f5753636b75033a49b7cc7d"
      }
    },"$id": {
        "$oid": "5f5753636b75033a49b7cc7e"
      }
    },"$id": {
        "$oid": "5f5753636b75033a49b7cc7f"
      }
    },"$id": {
        "$oid": "5f5753636b75033a49b7cc80"
      }
    },"$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

解决方法

您可以进行聚合查询并使用$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"
          }
        },{
          $group: {
            _id: "$_id",name: { $first: "$name" },order: { $first: "$order" },results: { $push: "$results" }
          }
        }
      ],as: "milestones"
    }
  },{ $unwind: "$milestones" },{
    $group: {
      _id: "$_id",description: { $first: "$description" },milestones: { $push: "$milestones" }
    }
  },// you can specify the name of collection that you want
  { $out: "collection name" }
])

Playground

,

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

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