【问题标题】:Mongoose count documents where count of array elements with property set to false is less than a valueMongoose 计数文档,其中属性设置为 false 的数组元素的计数小于一个值
【发布时间】:2020-10-05 01:20:36
【问题描述】:

我有一个集合,其中大多数文档都有一个对象数组,我关心的属性是一个布尔值,我正在寻找一个总文档数,其中数组中的对象数具有属性设置为false,小于10次。

架构是这样的

let MatchSchema = new Schema({
  home: {
    squad: [ SquadSchema ]
  },
  away: {
    squad: [ SquadSchema ]
  },
});

let SquadSchema = new Schema({
  check: Boolean
});

我一直在寻找一种方法来做到这一点,看起来聚合是要走的路,尽管我很难找到解决方案。看起来我可以使用它来获取每个 home.squad、away.squad 的大小以及每个文档的 id。

await Match.aggregate([
   {
      $project: {
         "squadCountHome": {$size: "$home.squad"},
         "squadCountAway": {$size: "$away.squad"},
      }
   }
]);

可以用aggregate来查看squad中的校验值是否小于10次,大于0次?

【问题讨论】:

  • $filter 会在这里工作吗?
  • 谢谢,我认为 filer 正是我想要的。

标签: node.js mongodb mongoose


【解决方案1】:

Joe 将我指向 $filter,我得到了如下所示的解决方案。

$project 和$filter 检索了squad.home 和squad.away 中check 属性设置为false 的所有元素。然后使用 $project 和 $size 来获取两者中具有 false 值的元素的总数,最后使用 $match 来识别 home 或 away 大小是否大于 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 } } ]
        }
      }
    ```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 2023-03-25
    • 2019-05-14
    • 2017-02-17
    • 2022-01-06
    • 2021-10-10
    • 2019-08-21
    • 2016-03-24
    相关资源
    最近更新 更多