在两个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();
将collection
replace为要执行查询的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 } ]