【问题标题】:Optimize multiple "and" statements in mongo aggregate优化mongo聚合中的多个“and”语句
【发布时间】:2021-01-23 12:25:59
【问题描述】:

有没有更简单的方法也可以提高这个 mongodb 查询的性能。我知道我想将其中一个或另一个分组,但找不到任何文档或示例来帮助我。

const facetQuery = { $facet: {
    xCreated: [
      { $match : { $and : [{ queueStatus: 'Created' }, { queueType: 'x' } ]}},
      { $count: "Created" },
    ],
    xApproved: [
      { $match : { $and : [{ queueStatus: 'Approved' }, { queueType: 'x' }]}},
      { $count: "Approved" }
    ],
    xDisapproved: [
      { $match : { $and : [{ queueStatus: 'Disapproved' }, { queueType: 'x' }]}},
      { $count: "Disapproved" }
    ],
    yCreated: [
      { $match : { $and : [{ queueStatus: 'Created' }, { queueType: 'y' }]}},
      { $count: "Created" },
    ],
    yApproved: [
      { $match : { $and : [{ queueStatus: 'Approved' }, { queueType: 'y' }]}},
      { $count: "Approved" }
    ],
    yDisapproved: [
      { $match : { $and : [{ queueStatus: 'Disapproved' }, { queueType: 'y' }]}},
      { $count: "Disapproved" }
    ],
    zCreated: [
      { $match : { $and : [{ queueStatus: 'Created' }, { queueType: 'z' }]}},
      { $count: "Created" },
    ],
    zApproved: [
      { $match : { $and : [{ queueStatus: 'Approved' }, { queueType: 'z' }]}},
      { $count: "Approved" }
    ],
    zDisapproved: [
      { $match : { $and : [{ queueStatus: 'Disapproved' }, { queueType: 'z' }]}},
      { $count: "Disapproved" }
    ],
  }};

【问题讨论】:

    标签: mongodb mongoose nestjs


    【解决方案1】:

    哇哦,您可以在statustype 上动态地$group,而不是进行所有这些单独的匹配和计数,然后从中构造您需要的对象:

    db.collection.aggregate([
      {
        $group: {
          _id: {
            type: "$queueType",
            status: "$queueStatus"
          },
          ApprovedCount: {
            $sum: {
              $cond: [
                {
                  $eq: [
                    "$queueStatus",
                    "Approved"
                  ]
                },
                1,
                0
              ]
            }
          },
          CreatedCount: {
            $sum: {
              $cond: [
                {
                  $eq: [
                    "$queueStatus",
                    "Created"
                  ]
                },
                1,
                0
              ]
            }
          },
          DisapprovedCount: {
            $sum: {
              $cond: [
                {
                  $eq: [
                    "$queueStatus",
                    "Disapproved"
                  ]
                },
                1,
                0
              ]
            }
          },
          
        }
      },
      {
        $replaceRoot: {
          newRoot: {
            $mergeObjects: {
              $arrayToObject: [
                [
                  {
                    k: {
                      $concat: [
                        "$_id.type",
                        "$_id.status"
                      ]
                    },
                    v: {
                      $switch: {
                        branches: [
                          {
                            case: {
                              $eq: [
                                "$_id.status",
                                "Approved"
                              ]
                            },
                            then: "$ApprovedCount"
                          },
                          {
                            case: {
                              $eq: [
                                "$_id.status",
                                "Created"
                              ]
                            },
                            then: "$CreatedCount"
                          },
                          {
                            case: {
                              $eq: [
                                "$_id.status",
                                "Disapproved"
                              ]
                            },
                            then: "$DisapprovedCount"
                          },
                          
                        ]
                      }
                    }
                  }
                ]
              ]
            }
          }
        }
      }
    ])
    

    Mongo Playground

    【讨论】:

    • 你在哪里对 queryType (x, y, z) 进行任何匹配?非常感谢您帮助这是我在 StackOverflow 上的第一个问题
    • 如果您运行您将看到的代码,group 阶段会为您处理这一切,因为它会根据状态和类型进行分组,创建所有需要的排列。
    • 谢谢汤姆,我对 no-sql 还是很陌生,但很喜欢它!
    猜你喜欢
    • 2015-07-27
    • 2011-12-21
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 2014-02-11
    • 2019-05-06
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多