mongodb将复杂数据展平以导出

时间:2019-06-28 05:31:25

标签: mongodb aggregation-framework

我想展平我的数据模型以csv格式导出。 我想我可以通过聚合达到目标,但是我不知道怎么做,

该模型由一些对象数组组成,我想投影 对象的某些字段以及主要对象的其他字段。

我有一个看起来像这样的模型

{
    "_id" : ObjectId,
    "email" : string,
    "dates" : {
        "registered" : ISODate,
        "last_activity" : ISODate
    },
    "autos" : [ 
        {
            "_id" : ObjectId,
            "make" : string,
            "model" : string,
            "color" : string
        }
    ],
    "boats": [
        {
            "_id" : ObjectId,
            "manu" : string,
            "model" : string,
            "motor" : string
        }
    ]
}

这是我对聚合管道的了解

db.users.aggregate( [ 
    { $unwind: "$autos" },
    {
      $project: {
          _id: 1,
          email: 1,
          'dates.registered': 1,
          'autos.make': 1,
          'autos.model': 1
      }
   }
 ] )

我的回报看起来像这样

{
    "_id" : ObjectId(),
    "dates" : {
        "registered" : ISODate()
    },
    "email" : "...",
    "autos" : {
        "make" : "...",        
        "model" : "..."
    }
}

但是我希望我的退货看起来像这样:

{
    "_id" : ObjectId(),
    "registered" : ISODate(),
    "email" : "..."
    "auto_make" : "...",        
    "auto_model" : "..."
}

,并采取后续措施-是否可以展开第二个阵列“船” 在同一查询中???

所以我的结果看起来像这样

{
    "_id" : ObjectId(),
    "registered" : ISODate(),
    "email" : "...",       
    "auto_model" : "...",
    "auto_color" : "...",      
    "boat_model" : "...",    
    "boat_motor" : "...",
}

1 个答案:

答案 0 :(得分:1)

对于汽车的品牌和型号,您可以通过将expression放入$project的键值对内的value字段中来轻松实现。

关于船的型号和发动机,您可以重做对汽车的操作以获取结果

db.users.aggregate( [ 
    { $unwind: "$autos" }, //this line can be removed if you want the result to be an array instead of a string
    {
      $project: {
          _id: 1,
          email: 1,
          registered: '$dates.registered',
          auto_make: '$autos.make',
          auto_model: '$autos.model'
      }
   }
 ] )
output: (with unwind) 
{
    "_id" : ObjectId("5d15aa446810eb770fd47f7c"),
    "email" : "string",
    "registered" : ISODate("2019-06-28T05:48:52.652Z"),
    "auto_make" : "string",
    "auto_model" : "string"
},
{
    "_id" : ObjectId("5d15aa446810eb770fd47f7c"),
    "email" : "string",
    "registered" : ISODate("2019-06-28T05:48:52.652Z"),
    "auto_make" : "string",
    "auto_model" : "string"
},
{
    "_id" : ObjectId("5d15aa446810eb770fd47f7c"),
    "email" : "string",
    "registered" : ISODate("2019-06-28T05:48:52.652Z"),
    "auto_make" : "string",
    "auto_model" : "string"
}
output: (without unwind))
{
    "_id" : ObjectId("5d15aa446810eb770fd47f7c"),
    "email" : "string",
    "registered" : ISODate("2019-06-28T05:48:52.652Z"),
    "auto_make" : [ 
        "string", 
        "string", 
        "string"
    ],
    "auto_model" : [ 
        "string", 
        "string", 
        "string"
    ]
}

已更新:都展开

此示例为2个自动3条船的1位用户提供6个输出文档

db.temp.aggregate( [ 
    { $unwind: "$autos" }, 
    { $unwind: "$boats" }, 
    {
      $project: {
          _id: 1,
          email: 1,
          registered: '$dates.registered',
          auto_make: '$autos.make',
          auto_model: '$autos.model',
          boat_model: '$boats.model',
          boat_motor: '$boats.motor'
      }
   }
 ] )