Mongoose считает определенный элемент во встроенном массиве документов

Я использую мангуст 4.6.3.

У меня есть следующая схема:

var mongoose = require('mongoose');
var User = require('./User');

var TicketSchema = new mongoose.Schema({
    user : { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
},
{
    timestamps: true
});

var DrawSchema = new mongoose.Schema({
  ...
  max_ticket_per_user : { type : Number, required: true },
  tickets: [TicketSchema]
});

module.exports = mongoose.model('Draw', DrawSchema);

Как я могу подсчитать вложенные документы определенного User ObjectId(пользовательского поля в TicketSchema) в тикетах Draw (поле тикетов в DrawSchema)? Я хочу посчитать билеты пользователя за один розыгрыш.

Будет ли лучше изменить дизайн моей схемы?

Спасибо

2 ответа

Решение

Вы можете использовать структуру агрегирования, используя преимущества $filter а также $size операторы, чтобы получить отфильтрованный массив с элементами, которые соответствуют идентификатору пользователя и его размеру соответственно, что впоследствии даст вам счет.

Для одного розыгрыша рассмотрите возможность добавления $match Оператор конвейера в качестве первого шага с помощью запроса _id для фильтрации документов в коллекции.

Чтобы получить желаемый результат, попробуйте запустить следующий конвейер агрегации:

Draw.aggregate([
    { "$match": { "_id": drawId } },
    {
        "$project": {
            "ticketsCount": {
                "$size": {
                    "$filter": {
                        "input": "$tickets",
                        "as": "item",
                        "cond": { "$eq": [ "$$item.user", userId ] }
                    }
                }
            }
        }
    }
]).exec(function(err, result) {
    console.log(result);
});

Вы можете передать .count() глубокие параметры, как и любой другой объект запроса:

Draw.count({'tickets.user._id' : userId}, console.log);

Убедитесь, что переменная userId является ObjectId. Если это строка, сделайте это:

const ObjectId = require('mongoose').Types.ObjectId;
let userId = new ObjectId(incomingStringId);
Другие вопросы по тегам