我在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.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") });
刚刚使用 Node v0.12.7 和 v4.4.4 在 Mongo v3.2.3 中实现了类似的东西,并使用了:
{ $gte: new Date(dateVar).toISOString() }
我传入了一个 ISODate(例如 2016-04-22T00:00:00Z),这适用于带有或不带有 toISOString 函数的 .find() 查询。但是在 .aggregate() $match 查询中使用时,它不喜欢 toISOString 函数!
如果您想在该日期的任何地方获取项目,则需要比较两个日期
您可以像这样从第一个日期中创建两个日期,以获得一天的开始和一天的结束。
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)
如果您想在过去 5 分钟内获得所有新事物,则必须进行一些计算,但这并不难...
首先在要匹配的属性上创建一个索引(包括排序方向 -1 表示降序,1 表示升序)
db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt
然后查询在过去 5 分钟(60 秒 * 5 分钟)内创建的文档....因为 javascript 的 .getTime()
返回毫秒,您需要将其乘以 1000,然后才能将其用作 new Date()
构造函数的输入。
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 分钟前”:
new Date().getTime() 以毫秒为单位为我们提供当前时间 我们想从中减去 5 分钟(以毫秒为单位): 5*60*1000 -- 我只需乘以 60 秒,因此很容易更改。如果我想要 2 小时(120 分钟),我可以将 5 更改为 120。 new Date().getTime()-60*5*1000 给我们 1484383878676 (5 分钟前,毫秒)
现在我们需要将其输入 new Date()
构造函数以获取 MongoDB 时间戳所需的 ISO 字符串格式。
$gte: new Date(resultFromAbove).toISOString() } (mongodb .find() 查询) 因为我们不能有变量,所以我们一次性完成:new Date(new Date().getTime()-60 *5*1000) ...然后转换为 ISO 字符串: .toISOString() new Date(new Date().getTime()-60*5*1000).toISOString() 给我们 2017-01-14T08:53: 17.586Z
当然,如果您使用的是 node-mongodb-native 驱动程序,那么使用变量会更容易一些,但这适用于我通常用来检查的 mongo shell。
Date.now()
而不是 new Date().getTime()
查找特定日期:
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))
}
})
你也可以试试:
{
"dateProp": { $gt: new Date('06/15/2016').getTime() }
}
如果您使用的是猫鼬,
try {
const data = await GPSDatas.aggregate([
{
$match: { createdAt : { $gt: new Date() }
},
{
$sort: { createdAt: 1 }
}
])
console.log(data)
} catch(error) {
console.log(error)
}
如果要从日期时间获取记录,可以使用以下命令:
(带有 PyMongo 的 mongodbCompass 3.6.8)
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()}})
ISODate
是 js Date 对象的包装器。尝试类似"createdAt" : new Date("2010-01-01")
。但是,出于某种原因,该代码在 Mongo 控制台中不 工作(对于 v. 2.0.2)。new Date("2010/01/01");