【问题标题】:Select fields' values as array mongoose / mongodb aggregation选择字段的值作为数组 mongoose / mongodb 聚合
【发布时间】:2017-06-02 10:08:15
【问题描述】:

我有一个 mongo 查询

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'
        }
    ]
}

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

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    使用您的 $group 步骤重构您的管道,使 _id 值为 null 以计算所有输入文档作为一个整体的累积值,从而将 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);
    

    【讨论】:

      猜你喜欢
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      相关资源
      最近更新 更多