在MongoDB的方法find()上使用$ dayOfYear

时间:2014-06-20 01:17:40

标签: mongodb mongodb-query aggregation-framework

我需要进行一个查询,我可以使用MongoDB获取年份的所有行。

行:

{
    "_id" : ObjectId("53a3733dfbea7787f4b4e8f6"),
    "_class" : "demo.model.User",
    "name" : "Tiare",
    "created" : ISODate("2014-06-19T23:33:17.000Z")
}

示例:

db.user.find({"created" : {$year : "2014"}})
db.user.find({"created" : {$dayOfYear : "170"}})

1 个答案:

答案 0 :(得分:2)

您所指的运算符为date aggregation operators,并保留在aggregation framework中使用,不能与其他方法一起使用。它们有不同的目的,即在“公共时间间隔”中“剖析”聚合日期,例如:

db.user.aggregate([
    { "$group": {
        "_id": {
            "year": { "$year": "$created" },
            "day": { "$dayOfYear": "$created" }
        },
        "count": { "$sum" 1 }
    }}
])

您似乎想要的是选择所需日期“范围”内的所有文件。您可以使用$gt$lt运算符以及cousins

执行此操作
db.user.find({
    "created": { "$gte": new Date("2014-01-01"), "$lt": new Date("2015-01-01") }
})

该示例中的哪一个获取“2014”中出现的所有日期

如果你真的想看看今年你的数据中是否有“第200天”这样的事情,那么你可以使用聚合做这样的事情:

db.user.aggregate([
    { "$group": {
        "_id": {
           "year": { "$year": "$created" },
           "day": {
               "$cond": [
                   { "$eq": [ {"$dayOfYear": "$created"}, 200 ] },
                   {"$dayOfYear": "$created"},
                   false
               ]
           }
    }}
])

如果在任何日期值中不存在匹配的“dayOfYear”或false,那么只会在“day”中返回结果。那将是最有效的方式。

您还可以$project$match,但这不是非常有效,因为您需要处理“投影”中的所有结果。

但通常会尝试在日期上坚持使用“范围”查询,因为这是最有效的处理方式,尤其是当您有索引时。