Документы Mongoose count, в которых количество элементов массива со свойством, равным false, меньше значения

#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 } } ]
        }
      }
    ```