选择字段作为数组猫鼬/ MongoDB的聚集值

问题描述:

我有一个蒙戈查询选择字段作为数组猫鼬/ MongoDB的聚集值

db.memberships.aggregate([{ 
     '$match': { 
      unit: new ObjectId('566fbaa1e63225b10bacac44') 
     } 
    }, 

    { 
     '$lookup': { 
      from: 'seasons', 
      localField: 'season', 
      foreignField: '_id', 
      as: 'season' 
     } 
    }, 

    { 
     '$unwind': '$season' 
    }, 
    { 
     '$project': { 
      season: { 
       'name': '$season.name', 
       'id': '$season._id' 
      } 
     } 
    }, 
    { 
     '$group': { 
      _id: '$_id', 
      'season': { 
       '$addToSet': '$season' 
      } 
     } 
    }, 

]); 

导致

[ 
    { 
     "_id": ObjectId("56a0e5a860d8a6e41eda2ea3"), 
     "season": [{ 
      "name": "Summer", 
      "id": ObjectId("56a0d6c692c26b8c019a2758") 
     }] 
    }, 
    { 
     "_id": ObjectId("56a0e56d60d8a6e41eda2e9e"), 
     "season": [{ 
      "name": "Summer", 
      "id": ObjectId("56a0d6c692c26b8c019a2758") 
     }] 
    }, 
    { 
     "_id": ObjectId("56a0e53860d8a6e41eda2e9a"), 
     "season": [{ 
      "name": "Summer", 
      "id": ObjectId("56a0d6c692c26b8c019a2758") 
     }] 
    }, 

    { 
     "_id": ObjectId("56a0e4d660d8a6e41eda2e94"), 
     "season": [{ 
      "name": "Winter", 
      "id": ObjectId("5680dc01ba1e41f5066526fa") 
     }] 
    } 
] 

我需要得到的结果在这种格式

{ 
    _id: [ 
     // ids here 
    ], 
    seasons: [{ 
      id: '56a0d6c692c26b8c019a2758', 
      'name': 'Summer' 
     }, 
     { 
      id: '5680dc01ba1e41f5066526fa', 
      'name': 'Winter' 
     } 
    ] 
} 

查询必须返回具有2个属性idseason的单个文档。季节必须是一系列独特的季节。每个赛季都应该包含一个id和一个名字。感谢帮助!

重塑您的管道与$group步骤有null_id值来计算累积值的所有输入文档作为一个整体,从而创建ID字段作为一切的唯一ID的数组:

var pipeline = [ 
    { 
     '$match': { 
      unit: new ObjectId('566fbaa1e63225b10bacac44') 
     } 
    }, 

    { 
     '$lookup': { 
      from: 'seasons', localField: 'season', foreignField: '_id', as: 'season' 
     } 
    }, 
    { 
     '$unwind' : '$season' 
    }, 
    { 
     '$project': { 
      season: {'name': '$season.name', 'id' : '$season._id'} 
     } 
    }, 
     { 
     '$group': { 
      "_id": null, 
      "id": { "$addToSet": "$_id" }, 
      'season': { 
       '$addToSet': '$season' 
      } 
     } 
    }  
]; 
db.memberships.aggregate(pipeline); 
+1

它的工作原理,谢谢! – styopdev