匹配内的多个条件 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`
您的 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"
}
}
])
注:
将 manager
添加为组键之一对两个查询都很好。由于您正在过滤特定(只有一个)经理的记录,所以没问题。但是如果不对特定经理进行过滤,您的查询将导致错误的输出。
我想将以下 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`
您的 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"
}
}
])
注:
将 manager
添加为组键之一对两个查询都很好。由于您正在过滤特定(只有一个)经理的记录,所以没问题。但是如果不对特定经理进行过滤,您的查询将导致错误的输出。