如何按日期和时间过滤MongoDB记录?

时间:2015-05-20 08:20:26

标签: mongodb date meteor

我正在学习如何使用MeteorJS,我的记录如下:

meteor:PRIMARY> db.meals.find()
{ "_id" : "kHjRCXRRoC6JLYjJY", "name" : "Spaghetti & Meatballs", "calories" : "300", "eatenAt" : ISODate("2015-05-20T07:07:00Z"), "userId" : "movpJRhRMwyMZDBqf", "author" : "sergiotapia" }
{ "_id" : "vcQZ2S4MXHs49BknJ", "name" : "Lasgagna", "calories" : "150", "eatenAt" : ISODate("2015-05-20T07:07:00Z"), "userId" : "movpJRhRMwyMZDBqf", "author" : "sergiotapia" }
{ "_id" : "oqw4HZ5tybBKfMJmj", "name" : "test", "calories" : "900", "eatenAt" : ISODate("2015-05-20T07:38:00Z"), "userId" : "movpJRhRMwyMZDBqf", "author" : "sergiotapia" }
{ "_id" : "Pq6vawvTnXQniBvMZ", "name" : "booya", "calories" : "1000", "eatenAt" : ISODate("2015-05-19T07:37:00Z"), "userId" : "movpJRhRMwyMZDBqf", "author" : "sergiotapia" }

我希望使用ISODate值按日期和时间过滤这些记录。例如,请记录1月1日至1月12日上午9点至下午2点之间的记录。

是否可以使用单个字段,或者我是否需要专门针对时间使用单独的字段?

1 个答案:

答案 0 :(得分:1)

您的查询基本上是:

查找2015-01-01和2015-01-12之间的文件,时间为09:00至14:00。

一种方法是使用 aggregation framework ,尤其是 Date Aggregation Operators 。您可以使用 meteorhacks:aggregate 包为Meteor添加适当的聚合支持。此程序包在.aggregate个实例上公开了Mongo.Collection方法。

使用

添加到您的应用中
meteor add meteorhacks:aggregate

然后只需使用下面的.aggregate功能。

var meals = new Mongo.Collection('meals');
var pipeline = [
    {
        "$project": {
            "year": { "$year": "$eatenAt" },
            "month": { "$month": "$eatenAt" },
            "day": { "$dayOfMonth": "$eatenAt" },
            "hour": { "$hour": "$eatenAt" },        
            "name" : 1,
            "calories" : 1,
            "eatenAt" : 1,
            "userId" : 1,
            "author" : 1
        }
    },
    {
        "$match": {
            "year": 2015,
            "month": 1,
            "day": { "$gte": 1, "$lte": 12 },
            "hour": { "$gt": 8, "$lt": 14 }
        }
    }
];

var result = meals.aggregate(pipeline);