【问题标题】:how to aggregate after populate with mongoose用猫鼬填充后如何聚合
【发布时间】:2017-01-23 15:43:31
【问题描述】:

我正在使用 mongoose,但在填充后进行聚合时遇到问题。 下面是一个例子。

mongoose 模型模式有两种,mongoose 和 collection。

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

以上不起作用,但我认为它可以解释我想要什么。将不胜感激。

【问题讨论】:

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


【解决方案1】:

您可以使用 $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);

【讨论】:

  • 哇。我会试试这个。谢谢!
猜你喜欢
  • 2019-08-29
  • 2016-12-19
  • 2015-09-15
  • 2018-01-30
  • 2015-12-23
  • 1970-01-01
  • 2014-03-26
  • 2015-09-30
  • 2012-11-11
相关资源
最近更新 更多