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