#node.js #mongodb #mongoose
#node.js #mongodb #mongoose
Вопрос:
У меня есть коллекция, в которой большинство документов содержат массив объектов, свойство, которое меня интересует, является логическим, и я хочу получить общее количество документов, в которых количество объектов в массиве имеет это свойство, равное false, менее чем в 10 раз.
Схемы примерно такие
let MatchSchema = new Schema({
home: {
squad: [ SquadSchema ]
},
away: {
squad: [ SquadSchema ]
},
});
let SquadSchema = new Schema({
check: Boolean
});
Я искал способ сделать это, и похоже, что Aggregate — это правильный путь, хотя у меня возникли проблемы с поиском решения. Похоже, я могу использовать это, чтобы получить размер каждого home.squad, away.squad и идентификатор для каждого документа.
await Match.aggregate([
{
$project: {
"squadCountHome": {$size: "$home.squad"},
"squadCountAway": {$size: "$away.squad"},
}
}
]);
Можно ли использовать aggregate, чтобы увидеть, является ли контрольное значение в squad false менее 10 раз и больше 0?
Комментарии:
1. Будет ли $filter работать здесь?
2. Спасибо, я думаю, что filer был именно тем, что я искал.
Ответ №1:
Джо указал мне на $filter, и я получил свое решение, которое выглядит примерно так, как показано ниже.
$project и $filter извлекли все элементы в squad.home и squad.там, где для свойства check было установлено значение false. Затем использовал $project и $size, чтобы получить общее количество элементов с ложными значениями в обоих, и, наконец, $match, чтобы определить, являются ли размеры дома или дома больше 0 и меньше 10
{
$project: {
home: {
$filter: {
input: "$home.squad",
as: "home",
cond: {$eq: ["$$home.check", false]}
}
},
away: {
$filter: {
input: "$away.squad",
as: "away",
cond: {$eq: ["$$away.check", false]}
},
}
}
},
{
$project: {
"squadCountHome": {$size: "$home"},
"squadCountAway": {$size: "$away"}
}
},
{
$match: {
$or: [ { squadCountHome: { $gt: 0, $lt: 10 } }, { squadCountAway: { $gt: 0, $lt: 10 } } ]
}
}
```