问题描述
我正在使用猫鼬,在填充后进行聚合时遇到问题.下面是一个示例.
I'm working with mongoose, and I have a problem in doing aggregate after populate.Belows are an example.
猫鼬模型有两个模式,monster和collection.
There are two mongoose model schema, monster and 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"到模式"monster"的外键.
As you see, field '_monster' is foreign key of schema 'collection' to schema 'monster'.
我想使用如下所示的路径填充怪物"和收藏".
I want to populate 'monster' and 'collection' using this path like below.
Collection.find().populate('_monster')
我想像下面这样汇总此结果.
And I want to aggregate this result like below.
AboveResult.aggregate([
{
'$project': {
'new_field': {
'$add': [
'$addedPower', '$addedArmor', '$_monster.power', '$_monster.armor'
]
}
}
}
]);
以上操作无效,但我认为它可以解释我想要的内容.答案将很感激.
Above doesn't work, but I think it would explain about what I want. Answer will be thanksful.
推荐答案
您可以使用 $lookup
作为填充的替代方法,这是在服务器上完成的:
You can use $lookup
as an alternative for the populate and this is done on the server:
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);
这篇关于用猫鼬填充后如何聚合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!