MongoDB的3.6和更大,讓誰今天有一個生日的所有用戶的列表,請使用$expr
運營商允許查詢語言中使用聚合表達式:
db.users.find({
"$expr": {
"$and": [
{ "$eq": [ { "$dayOfMonth": "$dob" }, { "$dayOfMonth": new Date() } ] },
{ "$eq": [ { "$month" : "$dob" }, { "$month" : new Date() } ] }
]
}
});
對於其他MongoDB版本,您需要運行一個使用流水線的集合操作,以便藉助$cond
操作員進行編輯。考慮執行以下管道:
db.users.aggregate([
{
"$redact": {
"$cond": [
"$and": [
{ "$eq": [ { "$dayOfMonth": "$dob" }, { "$dayOfMonth": new Date() } ] },
{ "$eq": [ { "$month" : "$dob" }, { "$month" : new Date() } ] }
]
],
"$$KEEP",
"$$PRUNE"
}
}
]);
的$cond
表達上述
"$cond": [
"$and": [
{ "$eq": [ { "$dayOfMonth": "$dob" }, { "$dayOfMonth": new Date() } ] },
{ "$eq": [ { "$month" : "$dob" }, { "$month" : new Date() } ] }
]
],
實質上代表所述條件語句
if (dob.getDate() === day && dob.getMonth === month) {
"$$KEEP" // keep the document in the pipeline
} else {
"$$PRUNE" // prune/discard the document from the output
}
和$redact
管道將返回匹配(基於$month
和$dayOfMonth
date operators通過$cond
返回系統變量)與$$KEEP
條件的所有文件,並與$$PRUNE
否則丟棄的文件。
感謝您的答覆。上述解決方案將只提取出生在特定年份的用戶。例如:2016年1月6日。但是我希望所有的生日不到1月6日的用戶發送生日祝福。 –
當時誤解了你的問題,但現在我想上面的編輯會解決這個問題,請檢查。 – chridam