2015-11-04 1538 views
1

我在MongoDB数据库中有一个包含一些数据并希望根据日期(忽略时间)过滤和查找数据的集合。如何根据日期在MongoDB中过滤/查找记录

样本数据

{ 
    "_id" : ObjectId("563a38173c2ab9248c02d89e"), 
    "jobId" : "oAEKMcCIJRIAAAFQbrAR6NDd", 
    "jobName" : "CheckSessions", 
    "jobDesc" : "Checks and deletes expired session data", 
    "jobType" : "Job", 
    "startTime" : "2015-11-04 00:00:01", 
    "endTime" : "2015-11-04 00:00:01", 
    "domainName" : "root", 
    "recurrencePeriod" : "60", 
    "recurrencePeriodDesc" : "HOURS(1)" 
} 
{ 
    "_id" : ObjectId("563a38173c2ab9248c02d89f"), 
    "jobId" : "C6wKMcCIJXoAAAFQm78R6NCm", 
    "jobName" : "CheckSessions", 
    "jobDesc" : "Checks and deletes expired session data", 
    "jobType" : "Job", 
    "startTime" : "2015-11-03 23:00:00", 
    "endTime" : "2015-11-03 23:00:01", 
    "domainName" : "root", 
    "recurrencePeriod" : "60", 
    "recurrencePeriodDesc" : "HOURS(1)" 
} 

我用下面的命令来获取比的具体日期更大的数据,但它并没有给我任何结果。 startTime和endTime都是EST格式。不知道我错过了什么。请指导。

db.jobs.find({"startTime" : { $gt : new Date("2015-11-03")}}); 
+0

你是如何保存'startTime'和'endTime'?我认为你把它们保存为字符串,所以Mongo不明白它们是日期。你可以使用简单的字符串比较:'{“startTime”:{$ gt:“2015-11-03”}}' – dgiugg

回答

2

答:你可以简单地通过字符串比较进行查询。

首先,确保指数的开始时间列

db.test.ensureIndex({startTime:1}) 

下面的命令找出你第二个对象在本例中与_id:ObjectId("563a38173c2ab9248c02d89f")

db.test.find({ 
    startTime: { 
     $gte: '2015-11-03 00:00:00', 
     $lt: '2015-11-04 00:00:00' 
    } 
}).pretty() 

通过在我们的查询运行解释(),我们可以看到索引实际上在使用中:

db.test.find({startTime:{$gte:'2015-11-03 00:00:00', $lt:'2015-11-04 00:00:00'}}).explain() 

{ 
    "cursor" : "BtreeCursor startTime_1", 
    "isMultiKey" : false, 
    "n" : 1, 
    "nscannedObjects" : 1, 
    "nscanned" : 1, 
    "nscannedObjectsAllPlans" : 1, 
    "nscannedAllPlans" : 1, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "indexBounds" : { 
     "startTime" : [ 
      [ 
       "2015-11-03 00:00:00", 
       "2015-11-04 00:00:00" 
      ] 
     ] 
    }, 
    "server" : "Jaans-MBP.home:27017" 
} 

我的建议仍然是按照最佳实践,并以适当的日期格式(例如,

"startTime" : ISODate("2016-05-02T00:00:02Z") 

MongoDB中壳你只需通过

> db.test.insert({startTime:new Date()}) 
> db.test.find() 
// results 
{ "_id" : ObjectId("563a49d63b1f1b7df0ebc4f5"), "startTime" : ISODate("2015-11-04T18:09:26.613Z") } 
+0

谢谢,并且很好的了解最佳实践,但是这里存储的数据来自一些其他表格,因此这里的日期格式略有不同(EST格式准确)。如何使用此特定日期格式查找记录?请指导。 – user2325154

+0

@dgiugg提供了非常准确的想法如何搜索(假设你有索引)。使用$ gte:“2015-01-01 00:00:00”,你应该没问题。我稍后再测试以确认它。 – jpaljasma

+0

已更新...并希望它有帮助。 – jpaljasma