对于 MongoDB 3.6 及更高版本,您可以使用$expr运算符在你的find()询问。这允许您构建查询表达式来比较同一文档中的字段$match stage.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
对于其他 MongoDB 版本,请考虑运行使用以下方法的聚合管道$redact运算符,因为它允许您将一个功能与单个管道合并$project创建一个代表日期字段月份的字段,并且$match过滤文档
符合九月份的给定条件。
在上文中,$redact uses $cond三元运算符作为提供条件表达式的手段,该条件表达式将创建执行编辑的系统变量。中的逻辑表达式$cond会检查
日期运算符字段与给定值的相等性,如果匹配则$redact将使用以下方式返回文档$$KEEP系统变量并丢弃,否则使用$$PRUNE.
运行以下管道应该会给您带来所需的结果:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
这类似于一个$project +$match组合,但您需要选择进入管道的所有其余字段:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
还有另一种选择,尽管查询速度很慢,但使用find()方法与$where as:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })