日期数组与我的日期范围匹配
Array of dates matches my date range
我有如下文件
{
"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")
]
}....
如果您的 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()
或者如果您的 collections 结构如下
{
"_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()
您可以在日期数组上使用 $elemMatch:
db.collection.find({
"dateArray": {
"$elemMatch": { "$gte": startDate, "$lte": endDate }
}
})
我有如下文件
{
"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")
]
}....
如果您的 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()
或者如果您的 collections 结构如下
{
"_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()
您可以在日期数组上使用 $elemMatch:
db.collection.find({
"dateArray": {
"$elemMatch": { "$gte": startDate, "$lte": endDate }
}
})