我需要进行一个查询,我可以使用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"}})
答案 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
,但这不是非常有效,因为您需要处理“投影”中的所有结果。
但通常会尝试在日期上坚持使用“范围”查询,因为这是最有效的处理方式,尤其是当您有索引时。