我怎样才能查询特定月份在MongoDB中,没有日期范围,我需要一个月,使客户的生日列表为当月。
在SQL将是类似的东西:
SELECT * FROM customer WHERE MONTH(bday)='09'
现在我需要翻译,在MongoDB中。 注:我的日期已经被保存在MongoDate类型,我用这种思想,将很容易以前一样工作,但现在我不能很容易地找到如何做到这一点简单的事情。
我怎样才能查询特定月份在MongoDB中,没有日期范围,我需要一个月,使客户的生日列表为当月。
在SQL将是类似的东西:
SELECT * FROM customer WHERE MONTH(bday)='09'
现在我需要翻译,在MongoDB中。 注:我的日期已经被保存在MongoDate类型,我用这种思想,将很容易以前一样工作,但现在我不能很容易地找到如何做到这一点简单的事情。
你可以做,使用aggregate
与$month
投影算:
db.customer.aggregate([
{$project: {name: 1, month: {$month: '$bday'}}},
{$match: {month: 9}}
]);
随着MongoDB的3.6及更高版本,可以使用$expr
在您的运营商find()
查询。 这使您可以建立一个比较来自于同一文档字段查询表达式$match
阶段。
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
对于其他MongoDB的版本,考虑运行聚合管道使用了$redact
运营商,因为它可以让你用一个单一的管道结合,具有功能$project
创建一个代表日期字段和月字段$match
过滤匹配月份是九月的给定条件哪些文件。
在上文中, $redact
使用$cond
tenary操作者装置,以提供条件表达式将创建系统变量,其确实的密文。 在逻辑表达式$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
为:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })
如果你关心效率,你可能需要一个月的数据存储在每个文档中的一个单独的字段。
首先,您需要检查数据类型是否ISODate。 如果没有,你可以改变数据类型,如下面的例子。
db.collectionName.find().forEach(function(each_object_from_collection){each_object_from_collection.your_date_field=new ISODate(each_object_from_collection.your_date_field);db.collectionName.save(each_object_from_collection);})
现在,您可以用两种方式找到它
db.collectionName.find({ $expr: {
$eq: [{ $year: "$your_date_field" }, 2017]
}});
或聚集
db.collectionName.aggregate([{$project: {field1_you_need_in_result: 1,field12_you_need_in_result: 1,your_year_variable: {$year: '$your_date_field'}, your_month_variable: {$month: '$your_date_field'}}},{$match: {your_year_variable:2017, your_month_variable: 3}}]);