根据日期返回查询

我在mongodb中有一个这样的数据

{
"latitude" : "",
"longitude" : "",
"course" : "",
"battery" : "0",
"imei" : "0",
"altitude" : "F:3.82V",
"mcc" : "07",
"mnc" : "007B",
"lac" : "2A83",
"_id" : ObjectId("4f0eb2c406ab6a9d4d000003"),
"createdAt" : ISODate("2012-01-12T20:15:31Z")
}

我如何查询db.gpsdatas.find({'createdAt': ??what here??}),以便它从db返回上面的数据结果给我?

535732 次浏览

你可能想要做一个范围查询,例如,在给定日期之后创建的所有项:

db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }});

我使用$gte(大于或等于),因为这通常用于仅限日期的查询,其中时间组件为00:00:00。

如果你真的想找到一个日期等于另一个日期,语法将是

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });

如果你想在那个日期的任何地方买东西,你需要比较两个日期

你可以在第一个日期的基础上创建两个日期,分别是一天的开始和一天的结束。

var startDate = new Date(); // this is the starting date that looks like ISODate("2014-10-03T04:00:00.188Z")


startDate.setSeconds(0);
startDate.setHours(0);
startDate.setMinutes(0);


var dateMidnight = new Date(startDate);
dateMidnight.setHours(23);
dateMidnight.setMinutes(59);
dateMidnight.setSeconds(59);


### MONGO QUERY


var query = {
inserted_at: {
$gt:morning,
$lt:dateScrapedMidnight
}
};


//MORNING: Sun Oct 12 2014 00:00:00 GMT-0400 (EDT)
//MIDNIGHT: Sun Oct 12 2014 23:59:59 GMT-0400 (EDT)

刚刚在Mongo v3.2.3中使用Node v0.12.7和v4.4.4实现了类似的东西,并使用:

{ $gte: new Date(dateVar).toISOString() }

我传入了一个ISODate(例如2016-04-22T00:00:00Z),这适用于.find()查询,无论是否使用toISOString函数。但是当在.aggregate() $match查询中使用时,它不喜欢toISOString函数!

你也可以试试:

{
"dateProp": { $gt: new Date('06/15/2016').getTime() }
}

如果你想在过去的5分钟内得到所有的新东西,你必须做一些计算,但这并不难…

首先在想要匹配的属性上创建一个索引(包括排序方向-1表示降序,1表示升序)

db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt

查询最近5分钟(60秒* 5分钟)内创建的文档....因为javascript的.getTime()返回的是毫秒,在你将它作为new Date()构造函数的输入之前,你需要将它乘以1000。

db.things.find({
createdAt: {
$gte: new Date(new Date().getTime()-60*5*1000).toISOString()
}
})
.count()

new Date(new Date().getTime()-60*5*1000).toISOString()的解释如下:

首先我们计算“5分钟前”:

  1. new Date().getTime()给出以毫秒为单位的当前时间
  2. 我们想要减去5分钟(以毫秒为单位):5*60*1000——我只是乘以60秒,所以它很容易改变。如果我想要2小时(120分钟),我可以将5更改为120
  3. new Date().getTime()-60*5*1000给出了1484383878676(5分钟前,毫秒)

现在我们需要将其提供给new Date()构造函数,以获得MongoDB时间戳所需的ISO字符串格式。

  1. { $gte: new Date(resultFromAbove).toISOString() } (mongodb .find()查询)
  2. 因为我们不能有变量,所以我们一次性完成:new Date(new Date().getTime()-60*5*1000)
  3. ...然后转换为ISO字符串:.toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString()给出了2017-01-14T08:53:17.586Z

当然,如果你使用node-mongodb-native驱动程序,这对变量来说会更容易一些,但这在mongo shell中是有效的,这是我通常用来检查东西的。

如果你正在使用猫鼬,

try {
const data = await GPSDatas.aggregate([
{
$match: { createdAt : { $gt: new Date() }
},
{
$sort: { createdAt: 1 }
}
])
console.log(data)


} catch(error) {
console.log(error)
}

找到一个特定的日期:

db.getCollection('CollectionName').find({"DepartureDate" : new ISODate("2019-06-21T00:00:00.000Z")})

找到较大的gte或较小的lt:

db.getCollection('CollectionName').find({"DepartureDate" : { $gte : new ISODate("2019-06-11T00:00:00.000Z") }})

按范围查找:

db.getCollection('CollectionName').find({
"DepartureDate": {
$lt: new Date(),
$gte: new Date(new Date().setDate(new Date().getDate()-15))
}
})

如果你想从一个datetime获取一个记录,你可以使用以下方法:

(mongodbCompass 3.6.8 with PyMongo)

mongo.db.collection.aggregate([{"$match":{"object.object.key":{"$gte":ISODate('2021-01-27T00:00:00Z').toISOString()}}}])


db.collection.find({"object.object.key":{"$gte":ISODate('2021-01-27T00:00:00Z').toISOString()}})