填充mongoose之后如何聚合

时间:2016-09-15 14:46:02

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

我和mongoose一起工作,我在填充后遇到聚合问题。 Belows就是一个例子。

有两个猫鼬模型架构,怪物和集合。

const monster = new Schema({
    name: { type: String },
    power: { type: Number },
    armor: { type: Number },
});

const collection = new Schema({
    _monster: { type: Schema.Types.ObjectId, ref: 'Monster' },
    addedPower: { type: Number },
    addedArmor: { type: Number },
});

如你所见,字段' _monster'是架构的外键'集合'架构'怪物'。

我想填充怪物'和'收集'使用如下所示的路径。

Collection.find().populate('_monster')

我想像下面这样汇总这个结果。

AboveResult.aggregate([
    {
        '$project': {
            'new_field': { 
                '$add': [ 
                     '$addedPower', '$addedArmor', '$_monster.power', '$_monster.armor' 
                ]
            }
        }
    }
]);

以上不起作用,但我认为这可以解释我想要的东西。答案会很感激。

1 个答案:

答案 0 :(得分:3)

您可以使用 $lookup 作为填充的替代方法,这可以在服务器上完成:

Collection.aggregate([
    {
        "$lookup": {
            "from": "monsters",
            "localField": "_monster",
            "foreignField": "_id",
            "as": "monster"
        }
    },
    { "$unwind": "$monster" },
    {
        "$project": {
            "name": "$monster.name",
            "power": "$monster.power",
            "armor": "$monster.armor",
            "addedPower": 1,
            "addedArmor": 1,
            'new_field': { 
                '$add': [ 
                    '$addedPower', 
                    '$addedArmor', 
                    '$monster.power', 
                    '$monster.armor' 
                ]
            }
        }
    }
]).exec(callback);