Модель Мангуста # Агрегатная функция, возвращающая 0 - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть следующие объекты:

  • Пользователь

  • Событие

  • Билет

  • TicketPurchase

Я пытаюсь подсчитать число Tickets во всех TicketPurchases для данного Event на основе определенного Ticket.type.

Я использую следующий код для достижения этой цели:

ticket.js

const TicketSchema = new Schema({
    type : {type: String},
    total_quantity : {type: Number},
    price : {type: String},
    limit_per_order: {type: Number},
    start_date: {type: Date},
    end_date: {type: Date},
    description: {type: String},
    validated: {type: String, default: 'false'}
});

ticketPurchase.js

const TicketPurchaseSchema = new Schema({
    user: {type: Schema.Types.ObjectId, ref: 'User'},
    event: {type: Schema.Types.ObjectId, ref: 'Event'},
    tickets: [{type: Schema.Types.ObjectId, ref: 'Ticket'}],
    time_stamp: {type: Date}

});

count.js

var event_id = req.query.event_id;
var ticket_id = req.query.ticket_id;

Ticket
.findOne({_id: ticket_id})
.exec(function(err, results){
    if(err){console.log(err);}
    console.log(results);//returns ticket successfully
    TicketPurchase.aggregate(
                    [
                    {"$match": {
                            "event": mongoose.Types.ObjectId(event_id)
                        }
                    },
                    {"$group": {
                            "_id": null,
                            "count": {
                                "$sum": {
                                    "$size": {
                                        "$filter": {
                                            "input": "$tickets",
                                            "as": "el",
                                            "cond": {
                                                "$eq": [ "$$el.type", results.type ]
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    ],

                    function(err, results){
                        if(err){
                            console.log(err);

                        }else{
                            console.log(results);//number of ticket purchases
                        }

                    }
        );

});

Но я продолжаю получать следующий результат:

count is always 0

Счетчик всегда равен 0, однако я могу подтвердить, что в TicketPurchase есть Билеты.

mLad

Также в этом посте предлагает избегать использования $ unwind.

Я все еще новичок в mongodb. Заранее спасибо

Инструменты:

  • Nodejs

  • Mongoose

  • MLAB

1 Ответ

0 голосов
/ 06 сентября 2018

Вам не хватает этапа $lookup, который позволяет объединить коллекцию покупок билетов с коллекцией билетов.

Добавьте следующий этап между $match и$group.

{"$lookup":{
  "from":"ticket",
  "localField":"tickets",
  "foreignField":"_id",
  "as":"tickets"
}}

Альтернативный и более Производительный Решение будет использовать $lookup + $unwind + $match комбинация для применения критериев типа к объединенной коллекции вместо $group с $filter.Замените все этапы после $match на следующие этапы.

Что-то вроде

{"$lookup":{
    "from":"ticket",
    "localField":"tickets",
    "foreignField":"_id",
    "as":"tickets"
}},
{"$unwind":"$tickets"},
{"$match":{"tickets.type":results.type}},
{"$count":"count"}
...