匹配内的多个条件 MongoDB

Multiple conditions inside match MongoDB

我想将以下 SQL 查询转换为 MongoDB 查询:

SELECT count(invoiceNo), year, month, manager 
FROM battle 
WHERE year=2021 AND month='Dec' OR year=2022 AND month='Jan' AND manager = 'name@test.com' 
GROUP BY year,month;

我试过这样做,但似乎不正确:

const getNoOfOrders = await BattlefieldInfo.aggregate([
 {
   $match: {
     $and: [
       {
         year: periodDate[0]['year']
       },
       { month: periodDate[0]['month'] }
     ],
     $or: [
       {
         $and: [
           {
             year: prevYear
           },
           { month: prevMonth }
         ]
       }
     ],
     $and: [{ manager: email }]
   }
 },
 {
   $group: {
     _id: '$month'
   }
 },
 {
   $project: {
     // noOfOrders: { $count: '$invoiceNo' },
     month: 1,
     year: 1,
     manager: 1
   }
 }
]);

因为我得到的是一个空数组。但它应该是这样的:

| count(invoiceNo) |    manager    | year | month |
+------------------+---------------+------+-------+
          2          name@test.com   2021    Dec
          3          name@test.com   2022    Jan

从我的角度来看,我认为圆括号(括号)对于将条件组合在一起(例如月份和年份)很重要。

SELECT count(invoiceNo), `year`, month, manager
FROM battle 
WHERE (`year` = 2021 AND month = 'Dec') 
OR (`year` = 2022 AND month = 'Jan') 
AND manager = 'abc@email.com'
GROUP BY month, `year`

Sample DBFiddle


您的 MongoDB 查询也是如此。虽然要搜索月份和年份,但您可以不使用 $and,如下所示:

{
  year: 2021,
  month: "Dec"
}

而不是:

$and: [
  {
    year: 2021
  },
  {
    month: "Dec"
  }
]

并确保 $group 阶段需要一个累加器运算符:

noOfOrders: {
  $count: {}
}

noOfOrders: {
  $sum: 1
}

Complete MongoDB query

db.collection.aggregate([
  {
    $match: {
      $or: [
        {
          year: 2021,
          month: "Dec"
        },
        {
          year: 2022,
          month: "Jan"
        }
      ],
      manager: "abc@email.com"
    }
  },
  {
    $group: {
      _id: {
        month: "$month",
        year: "$year"
      },
      noOfOrders: {
        $count: {}
      },
      manager: {
        $first: "$manager"
      }
    }
  },
  {
    $project: {
      _id: 0,
      noOfOrders: 1,
      month: "$_id.month",
      year: "$_id.year",
      manager: "$manager"
    }
  }
])

Sample Mongo Playground


注:

manager 添加为组键之一对两个查询都很好。由于您正在过滤特定(只有一个)经理的记录,所以没问题。但是如果不对特定经理进行过滤,您的查询将导致错误的输出。