在两个dateMongoDB之间查找对象

我一直在玩MongoDB中存储的tweets,每个对象看起来像这样:

{ "_id" : ObjectId("4c02c58de500fe1be1000005"), "contributors" : null, "text" : "Hello world", "user" : { "following" : null, "followers_count" : 5, "utc_offset" : null, "location" : "", "profile_text_color" : "000000", "friends_count" : 11, "profile_link_color" : "0000ff", "verified" : false, "protected" : false, "url" : null, "contributors_enabled" : false, "created_at" : "Sun May 30 18:47:06 +0000 2010", "geo_enabled" : false, "profile_sidebar_border_color" : "87bc44", "statuses_count" : 13, "favourites_count" : 0, "description" : "", "notifications" : null, "profile_background_tile" : false, "lang" : "en", "id" : 149978111, "time_zone" : null, "profile_sidebar_fill_color" : "e0ff92" }, "geo" : null, "coordinates" : null, "in_reply_to_user_id" : 149183152, "place" : null, "created_at" : "Sun May 30 20:07:35 +0000 2010", "source" : "web", "in_reply_to_status_id" : { "floatApprox" : 15061797850 }, "truncated" : false, "favorited" : false, "id" : { "floatApprox" : 15061838001 } 

我将如何编写一个查询created_at并查找18:47和19:00之间的所有对象? 我是否需要更新文件,以便date以特定格式存储?

MongoDB Cookbook中 查询date范围(特定的月份或date)对这个问题有很好的解释,但是下面是我自己尝试过的一些东西,看起来可行。

 items.save({ name: "example", created_at: ISODate("2010-04-30T00:00:00.000Z") }) items.find({ created_at: { $gte: ISODate("2010-04-29T00:00:00.000Z"), $lt: ISODate("2010-05-01T00:00:00.000Z") } }) => { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" } 

根据我的实验,您需要将date序列化为MongoDB支持的格式,因为以下内容会导致不期望的search结果。

 items.save({ name: "example", created_at: "Sun May 30 18.49:00 +0000 2010" }) items.find({ created_at: { $gte:"Mon May 30 18:47:00 +0000 2015", $lt: "Sun May 30 20:40:36 +0000 2010" } }) => { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" } 

在第二个例子中没有预料到结果,但仍然有一个结果。 这是因为基本的string比较已完成。

MongoDB实际上将一个date的毫秒存储为int(64),如http://bsonspec.org/#/specification

但是,如果客户端驱动程序使用自己的本地时区实例化一个date对象,那么当您检索date时,它会变得非常混乱。 mongo控制台中的JavaScript驱动程序肯定会这样做。

所以,如果你关心你的时区,那么确保你知道什么是你应该回来的时候。 这不应该太重要的查询,因为它仍然等同于相同的int(64),不pipe你的date对象是在什么时区(我希望)。 但我肯定会用实际的date对象(而不是string)查询,并让司机做它的事情。

澄清。 重要的是要知道的是:

  • 是的,你必须传递一个Javascriptdate对象。
  • 是的,它必须是ISODate友好
  • 是的,从我的经验得到这个工作,你需要操纵ISO的date
  • 是的,使用date通常是一个乏味的过程,mongo也不例外

这里是一段代码,我们做了一些date操作来确保Mongo(在这里我使用mongoose模块,并希望得到的结果date属性小于(之前)作为myDate参数给出的date)可以处理正确的:

 var inputDate = new Date(myDate.toISOString()); MyModel.find({ 'date': { $lte: inputDate } }) 
 db.collection.find({"createdDate":{$gte:new ISODate("2017-04-14T23:59:59Z"),$lte:new ISODate("2017-04-15T23:59:59Z")}}).count(); 

collectionreplace为要执行查询的collection的名称

将您的date转换为GMT时区,因为您将它们填充到Mongo中。 这样就不存在时区问题。 然后,只需在twitter / timezone字段中进行math计算,然后再将数据提取出来进行演示。

为什么不把string转换成YYYYMMDDHHMMSSforms的整数? 然后每增加一个时间就会创build一个更大的整数,你可以过滤整数,而不用担心转换为ISO时间。

我试图在这个模型根据我的要求,我需要存储一个date,当有一个对象被创build后,我想检索我的HTML文件中的两个date之间的所有logging(文档)我使用以下格式mm / dd / yyyy

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <script> //jquery $(document).ready(function(){ $("#select_date").click(function() { $.ajax({ type: "post", url: "xxx", datatype: "html", data: $("#period").serialize(), success: function(data){ alert(data); } ,//success }); //event triggered });//ajax });//jquery </script> <title></title> </head> <body> <form id="period" name='period'> from <input id="selecteddate" name="selecteddate1" type="text"> to <input id="select_date" type="button" value="selected"> </form> </body> </html> 

在我的py(python)文件中,我用下面的方法把它转换成“iso fomate”

 date_str1 = request.POST["SelectedDate1"] SelectedDate1 = datetime.datetime.strptime(date_str1, '%m/%d/%Y').isoformat() 

并保存在我的集合中“SelectedDate”字段中的dbmongo集合中

检索我使用以下查询之间的2个date之间的数据或文档

 db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}}) 

集合名称:订单

 { "_id" : ObjectId("590070186bcc993d9c316ac1"), "updatedAt" : ISODate("2017-04-26T10:07:04.344Z"), "createdAt" : ISODate("2017-04-26T10:02:00.489Z"), "fullName" : "test last", "imgLength" : 5, "firstName" : "test", "lastName" : "last", "address" : "test", "state" : "test", "city" : "test", "zipCode" : 123456, "user" : ObjectId("58f760e771fd1737d1f9b4e5"), "orderId" : "PHA454494125243881", "status" : "Pending", "imgUrls" : [ ], "__v" : 0 } { "_id" : ObjectId("590071622e6d953e411dec3f"), "updatedAt" : ISODate("2017-04-20T10:37:46.569Z"), "createdAt" : ISODate("2017-04-20T10:07:30.572Z"), "fullName" : "test last", "imgLength" : 5, "firstName" : "test", "lastName" : "last", "address" : "test", "state" : "test", "city" : "test", "zipCode" : 123456, "user" : ObjectId("58f760e771fd1737d1f9b4e5"), "orderId" : "PHA300991061399836", "status" : "Pending", "imgUrls" : [ ], "__v" : 0 } { "_id" : ObjectId("590071902e6d953e411dec40"), "updatedAt" : ISODate("2017-04-15T10:08:16.111Z"), "createdAt" : ISODate("2017-04-15T10:08:16.111Z"), "fullName" : "test last", "imgLength" : 5, "firstName" : "test", "lastName" : "last", "address" : "test", "state" : "test", "city" : "test", "zipCode" : 123456, "user" : ObjectId("58f760e771fd1737d1f9b4e5"), "orderId" : "PHA876174070036339", "status" : "Pending", "imgUrls" : [ ], "__v" : 0 } 

如果你想获取两个date之间的数据,那么你可以运行下面的查询:

 db.orders.find({ createdAt:{ $gt:ISODate("2017-04-10T10:08:16.111Z"), $lt:ISODate("2017-05-25T10:08:16.111Z")} }).pretty(); 

你的结果是:

 [ { "_id" : ObjectId("590071622e6d953e411dec3f"), "updatedAt" : ISODate("2017-04-20T10:37:46.569Z"), "createdAt" : ISODate("2017-04-20T10:07:30.572Z"), "fullName" : "test last", "imgLength" : 5, "firstName" : "test", "lastName" : "last", "address" : "test", "state" : "test", "city" : "test", "zipCode" : 123456, "user" : ObjectId("58f760e771fd1737d1f9b4e5"), "orderId" : "PHA300991061399836", "status" : "Pending", "imgUrls" : [ ], "__v" : 0 } { "_id" : ObjectId("590071902e6d953e411dec40"), "updatedAt" : ISODate("2017-04-15T10:08:16.111Z"), "createdAt" : ISODate("2017-04-15T10:08:16.111Z"), "fullName" : "test last", "imgLength" : 5, "firstName" : "test", "lastName" : "last", "address" : "test", "state" : "test", "city" : "test", "zipCode" : 123456, "user" : ObjectId("58f760e771fd1737d1f9b4e5"), "orderId" : "PHA876174070036339", "status" : "Pending", "imgUrls" : [ ], "__v" : 0 } ]