我有以下对象:
{
...
"junctionId" : "6301",
"ts" : ISODate("2016-08-10T11:17:47.000Z")
...
}
我想过滤那些没有特定日期时间戳的文档。
我可以通过:
db.getCollection('phasedata-test').aggregate([
{ $match : {
ts : { $gte : ISODate('2016-08-18T21:00:00.000Z'), $lte: ISODate('2016-08-25T21:30:00.000Z') },
junctionId : { $eq : "6301"}}
},
{
$sort: {ts : 1}
},
{ "$group": {
"_id": {
"year": { "$year": "$ts" },
"month": { "$month": "$ts" },
"day": { "$dayOfMonth": "$ts" },
"hour": { "$hour": "$ts" },
"interval": {
"$subtract": [
{ "$minute": "$ts" },
{ "$mod": [{ "$minute": "$ts"}, 15 ] }
]
}
},
"dayOfWeek": { "$first": { "$dayOfWeek": "$ts" }},
}
},
{ $match :{
"dayOfWeek" : { $eq : 5}}
}
请不要看id grouping
。我的查询是必要的。
文档数量可能很大,所以我想减少要处理的文档数量。如何在首次匹配操作中使用星期几过滤器?
关于
答案 0 :(得分:0)
最强大的解决方案是最简单的解决方案:添加字段dayOfWeek
您的基本文档。
在它上面创建一个索引......一切都很完美: - )
=================
这是一种简单的方法 - 但需要付费 - 每次ts
字段都会更新,那么dayOfWeek
也必须更新。
答案 1 :(得分:0)
您可以使用 $addFields
聚合作为匹配前的第一阶段:
[{
$addFields: {
DayOfWeek: {
$dayOfWeek: {
date: "$date"
}
}
}
}, {
$match: {
DayOfWeek: {
$eq: 5
}
}
}, {}]