MongoDB:与dayOfWeek过滤器匹配操作

时间:2016-09-11 10:05:03

标签: mongodb

我有以下对象:

{
    ...
    "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。我的查询是必要的。

文档数量可能很大,所以我想减少要处理的文档数量。如何在首次匹配操作中使用星期几过滤器?

关于

2 个答案:

答案 0 :(得分:0)

最强大的解决方案是最简单的解决方案:添加字段dayOfWeek您的基本文档。

在它上面创建一个索引......一切都很完美: - )

=================

这是一种简单的方法 - 但需要付费 - 每次ts字段都会更新,那么dayOfWeek也必须更新。

答案 1 :(得分:0)

您可以使用 $addFields 聚合作为匹配前的第一阶段:

[{
    $addFields: {
        DayOfWeek: {
            $dayOfWeek: {
                date: "$date"
            }
        }
    }
}, {
    $match: {
        DayOfWeek: {
            $eq: 5
        }
    }
}, {}]