MongoDB的查询特定月份|一年没有日期MongoDB的查询特定月份|一年没有日期(Mongodb

2019-05-12 05:48发布

我怎样才能查询特定月份在MongoDB中,没有日期范围,我需要一个月,使客户的生日列表为当月。

在SQL将是类似的东西:

SELECT * FROM customer WHERE MONTH(bday)='09'

现在我需要翻译,在MongoDB中。 注:我的日期已经被保存在MongoDate类型,我用这种思想,将很容易以前一样工作,但现在我不能很容易地找到如何做到这一点简单的事情。

Answer 1:

你可以做,使用aggregate$month投影算:

db.customer.aggregate([
  {$project: {name: 1, month: {$month: '$bday'}}},
  {$match: {month: 9}}
]);


Answer 2:

随着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" })


Answer 3:

如果你关心效率,你可能需要一个月的数据存储在每个文档中的一个单独的字段。



Answer 4:

首先,您需要检查数据类型是否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}}]);


文章来源: Mongodb query specific month|year not date