Как получить поле суммы стоимости в связанном документе - PullRequest
0 голосов
/ 27 октября 2019

У меня есть две модели Mongoose: пользовательская и одна для активности, связанной с ними

пользовательская схема

let userSchema = new mongoose.Schema({
    name: { type: String, required: true },
    clan: { type: String },
    activities: [{
        type: mongoose.Schema.ObjectId,
        ref: 'Activity',
    }],
});

схема действий

let activitySchema = new mongoose.Schema({
    name: { type: String },
    point: { type: Number },
});

Таким образом, данные представляют собой нечтокак это

[{
    name: "Player A",
    clan: "Some Clan",
    activities: [{
         name: "Wake up",
         point: 5
    },{
         name: "Eat,
         point: 3
    }]
},{
    name: "Player B",
    clan: "Some Clan",
    activities: [{
         name: "Wake up",
         point: 5
    },{
         name: "Sleep",
         point: 5
    }]
}]

теперь, как я суммирую все игровые очки, где игрок находится в клане "Some Clan"?

Я ожидаю такой результат

{
     sumOfPoints: 18 // because sum of player activities in "Some Clan" is 5 + 3 + 5 + 5
}

1 Ответ

0 голосов
/ 27 октября 2019

Форма запроса, как это:

db.user.aggregate({$match:{clan:"Clan A"}},
    {$unwind: {path:"$activity"}},
    {$lookup:{from: "activityCollection", localField: "activity._id", foreignField:"_id", as:"activityData"}},
    {$unwind: {path: "$activityData" }},
    {$group:{
        _id:"$_id", 
        name: {$first: "$name"},
        clan: {$first: "$clan"},
        totalPoints:{$sum:"$activityData.points"}
    }}).pretty()

Объяснение:

Сначала я использовал $unwind в поле activity изusers коллекция как массив, и мы хотим выполнить $lookup с полем _id из массива действий.

после выполнения $lookup, я использовал $unwind в результате поиска,

и $group stage, используются $sum accumulator для добавления баллов.

Надеюсь, это поможет вам найти ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...