2

Я работаю с мангустом, и у меня есть проблема с агрегатом после заполнения. Ниже приведены примеры.как агрегировать после заполнения с помощью мангуста

Есть две схемы модели монгун, монстр и коллекция.

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

Выше не работает, но я думаю, что это объяснило бы то, что я хочу. Ответ будет очень благодарен.

+0

Возможно дублировать http://stackoverflow.com/questions/16680015/how-to-use- populate-and-aggregate-in-same-statement –

ответ

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); 
+1

Wow. Я попробую это. Спасибо! – Benjamin

+0

Он отлично работал! – Benjamin

Смежные вопросы