我想將以下 SQL 查詢轉換為 MongoDB 查詢:
SELECT count(invoiceNo), year, month, manager
FROM battle
WHERE year=2021 AND month='Dec' OR year=2022 AND month='Jan' AND manager = '[email protected]'
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
uj5u.com熱心網友回復:
從我的角度來看,我認為括號(括號)對于將月份和年份等條件組合在一起很重要。
SELECT count(invoiceNo), `year`, month, manager
FROM battle
WHERE (`year` = 2021 AND month = 'Dec')
OR (`year` = 2022 AND month = 'Jan')
AND manager = '[email protected]'
GROUP BY month, `year`
示例 DBFiddle
您的 MongoDB 查詢也是如此。使用月份和年份進行搜索時,您可以不使用$and以下方法:
{
year: 2021,
month: "Dec"
}
代替:
$and: [
{
year: 2021
},
{
month: "Dec"
}
]
并確保該$group階段需要一個累加器運算子:
noOfOrders: {
$count: {}
}
或者
noOfOrders: {
$sum: 1
}
完成 MongoDB 查詢
db.collection.aggregate([
{
$match: {
$or: [
{
year: 2021,
month: "Dec"
},
{
year: 2022,
month: "Jan"
}
],
manager: "[email protected]"
}
},
{
$group: {
_id: {
month: "$month",
year: "$year"
},
noOfOrders: {
$count: {}
},
manager: {
$first: "$manager"
}
}
},
{
$project: {
_id: 0,
noOfOrders: 1,
month: "$_id.month",
year: "$_id.year",
manager: "$manager"
}
}
])
示例 Mongo Playground
筆記:
manager將兩個查詢都添加為組鍵之一會很棒。由于您正在過濾特定(只有一個)經理的記錄,所以很好。但是如果不過濾特定經理,您的查詢將導致錯誤的輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/417226.html
標籤:
