具体日期比较

时间:2016-11-14 14:26:25

标签: mongodb mongoose aggregation-framework

假设我有这样的文件:

{
    productName: 'soap',
    expiredDate: ISO_DATE_FORMAT
}

在普通的sql中我可以像这样查询: SELECT * FROM table_name WHERE Month(expiredDate) = 11

如何在mongoDB或mongooseJS中实现它?

2 个答案:

答案 0 :(得分:1)

您可以使用聚合框架,该框架包含一些您可以使用的运算符。考虑第一个用例,该用例着眼于操纵 date operators 管道中的$project以及后续 $match 管道来过滤基于文档在 $month 表达式的附加字段中:

db.collection.aggregate([
    {
        "$project": {
            "productName": 1,
            "expiredDate": 1,
            "expiredMonth": { "$month": "$expiredDate" }
        }
    },
    { "$match": { "expiredMonth": 11 } }
])

另一种选择是使用带有 $redact 运算符的单一管道,其中包含 $project $match的功能如上所述,使用 $$KEEP 系统变量返回符合指定条件的所有文档,并使用 $$PRUNE 系统变量。请记住,此运算符执行集合扫描,因此第一个管道选项可能是最佳的:

db.collection.aggregate([
    {
        "$redact": {
            "$cond": [
                { 
                    "$eq": [
                        { "$month": "$expiredDate" }, 
                        11
                    ]
                }, 
                "$$KEEP", 
                "$$PRUNE"
            ]
        }
    }
])

答案 1 :(得分:0)

您可以使用聚合框架

db.collection.aggregate([{$project : {month  : {"$month" : $expiredDate},productName : 1,expiredDate:1},{$match : {month : 11}}])