日期数组与我的日期范围匹配

时间:2015-02-05 11:55:58

标签: mongodb mongodb-query

我有以下文件

{
"dates":[ISODate("2014-12-08T18:05:14.178Z"),
        ISODate("2014-12-07T18:05:14.178Z"),
        ISODate("2014-12-06T18:05:14.178Z")]
}, 
{
"dates":[ISODate("2014-12-01T18:05:14.178Z"),
        ISODate("2014-12-02T18:05:14.178Z"),
        ISODate("2014-12-06T18:05:14.178Z")]
}, ...

我想过滤日期包含日期介于

之间的集合

ISODate("2014-12-08T00:00:00.000Z") and ISODate("2014-12-08T23:59:59.000Z")

结果应该是

[{
    "dates":[ISODate("2014-12-08T18:05:14.178Z"),
            ISODate("2014-12-07T18:05:14.178Z"),
            ISODate("2014-12-06T18:05:14.178Z")]
    }]

我只想尝试$in运算符,但它如何过滤日期范围?

我是mongoDB的新手。

修改

db.crawler_status.find({dates:{$gt:new ISODate("2015-02-04 00:00:00:000Z"), $lt: new ISODate("2015-02-04 23:59:59:000Z")}});

结果:

{
    ...
    "dates" : [ 
        ISODate("2014-12-05T00:28:13.584Z"), 
        ISODate("2014-12-05T03:47:10.841Z"), 
        ISODate("2014-12-05T04:27:53.166Z"), 
        ISODate("2014-12-05T08:28:13.476Z"), 
        ISODate("2014-12-05T10:18:09.281Z")
    ]
}

/* 1 */
{
    "check_dates" : [ 
        ISODate("2014-12-05T03:24:04.651Z"), 
        ISODate("2014-12-05T03:39:45.596Z"), 
        ISODate("2014-12-05T07:40:05.435Z"), 
        ISODate("2014-12-05T11:40:06.114Z"), 
        ISODate("2014-12-05T15:40:05.842Z")
    ]
}....

2 个答案:

答案 0 :(得分:3)

如果你的mongo文件如下

{
    "_id" : ObjectId("54d35b0457941c5a55ff3bf4"),
    "datesData" : [
        {
            "dates" : [
                ISODate("2014-12-08T18:05:14.178Z"),
                ISODate("2014-12-07T18:05:14.178Z"),
                ISODate("2014-12-06T18:05:14.178Z")
            ]
        },
        {
            "dates" : [
                ISODate("2014-12-01T18:05:14.178Z"),
                ISODate("2014-12-02T18:05:14.178Z"),
                ISODate("2014-12-06T18:05:14.178Z")
            ]
        }
    ]
}

然后在聚合查询下方显示您想要的结果

db.collectionName.aggregate({
    "$unwind": "$datesData"
},
{
    "$match": {
    "$and": [
        {
            "datesData.dates": {
                "$gt": ISODate("2014-12-08T00:00:00.000Z")
            }
        },
        {
            "datesData.dates": {
                "$lt": ISODate("2014-12-08T23:59:59.000Z")
            }
        }
    ]
    }
}).pretty()

或者,如果您的馆藏结构如下

{
    "_id" : ObjectId("54d35eca57941c5a55ff3bf5"),
    "dates" : [
        ISODate("2014-12-08T18:05:14.178Z"),
        ISODate("2014-12-07T18:05:14.178Z"),
        ISODate("2014-12-06T18:05:14.178Z")
    ]
}
{
    "_id" : ObjectId("54d35ed657941c5a55ff3bf6"),
    "dates" : [
        ISODate("2014-12-01T18:05:14.178Z"),
        ISODate("2014-12-02T18:05:14.178Z"),
        ISODate("2014-12-06T18:05:14.178Z")
    ]
}

然后尝试这个简单的查询

db.collectionName.find({
    "$and": [
    {
        "dates": {
            "$gt": ISODate("2014-12-08T00:00:00.000Z")
        }
    },
    {
        "dates": {
            "$lt": ISODate("2014-12-08T23:59:59.000Z")
        }
    }
    ]
}).pretty()

答案 1 :(得分:0)

您可以在日期数组上使用 $elemMatch:

db.collection.find({ 
  "dateArray": {
    "$elemMatch": {  "$gte": startDate, "$lte": endDate  }
  }
})