如何在mongodb中查询特定月份,而不是日期范围,我需要月份来列出当前月份的客户生日。在SQL中会是这样的:
SELECT * FROM customer WHERE MONTH(bday)='09'
字符串注意:我的日期已经保存在MongoDate类型中了,我以前用这个想法很容易工作,但现在我无法轻松找到如何做这个简单的事情。
lbsnaicq1#
在MongoDB 3.6及更新版本中,您可以在**find()查询中使用$expr运算符。这允许您构建查询表达式,在$match**阶段中比较来自同一文档的字段。
find()
$expr
$match
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
字符串对于其他MongoDB版本,请考虑运行一个使用**$redact运算符的聚合管道,因为它允许您在单个管道中合并一个功能,其中$project用于创建表示日期字段的月份的字段,$match用于过滤与给定条件(月份为9月)匹配的文档。在上面,$redact使用$condtenary运算符作为提供条件表达式的手段,该条件表达式将创建执行密文的系统变量。$cond中的逻辑表达式将检查具有给定值的日期运算符字段是否相等,如果匹配,则$redact将使用$$KEEP系统变量返回文档,否则使用$$PRUNE**丢弃文档。运行以下管道应该会给你给予所需的结果:
$redact
$project
$cond
$$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**如下:
$where
db.customer.find({ "$where": "this.bday.getMonth() === 8" })
型
6yt4nkrj2#
您可以使用aggregate和$month投影运算符来实现这一点:
aggregate
$month
db.customer.aggregate([ {$project: {name: 1, month: {$month: '$bday'}}}, {$match: {month: 9}} ]);
字符串
qncylg1j3#
首先,您需要检查数据类型是否在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}}]);
p4tfgftt4#
是的,你可以在这样的日期内获取这个结果,
db.collection.find({ $expr: { $and: [ { "$eq": [ { "$month": "$date" }, 3 ] }, { "$eq": [ { "$year": "$date" }, 2020 ] } ] } })
8dtrkrch5#
如果您关心效率,您可能希望将月份数据存储在每个文档中的单独字段中。
5条答案
按热度按时间lbsnaicq1#
在MongoDB 3.6及更新版本中,您可以在**
find()
查询中使用$expr
运算符。这允许您构建查询表达式,在$match
**阶段中比较来自同一文档的字段。字符串
对于其他MongoDB版本,请考虑运行一个使用**
$redact
运算符的聚合管道,因为它允许您在单个管道中合并一个功能,其中$project
用于创建表示日期字段的月份的字段,$match
用于过滤与给定条件(月份为9月)匹配的文档。在上面,
$redact
使用$cond
tenary运算符作为提供条件表达式的手段,该条件表达式将创建执行密文的系统变量。$cond
中的逻辑表达式将检查具有给定值的日期运算符字段是否相等,如果匹配,则$redact
将使用$$KEEP
系统变量返回文档,否则使用$$PRUNE
**丢弃文档。运行以下管道应该会给你给予所需的结果:
型
这类似于**
$project
+$match
**组合,但您需要选择进入管道的所有其余字段:型
另一个替代方法,尽管查询很慢,使用**
find()
方法,$where
**如下:型
6yt4nkrj2#
您可以使用
aggregate
和$month
投影运算符来实现这一点:字符串
qncylg1j3#
首先,您需要检查数据类型是否在ISODate中。如果不是,您可以更改数据类型,如下所示。
字符串
现在你可以通过两种方式找到它
型
或者通过聚合
型
p4tfgftt4#
是的,你可以在这样的日期内获取这个结果,
字符串
8dtrkrch5#
如果您关心效率,您可能希望将月份数据存储在每个文档中的单独字段中。