Hral som si s ukladaním tweetov vo vnútri mongodb, každý objekt vyzerá takto:
{
"_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
}
Ako by som napísal dotaz, ktorý skontroluje created_at a nájde všetky objekty medzi 18:47 a 19:00? Musím aktualizovať svoje dokumenty tak, aby boli dátumy uložené v špecifickom formáte?
Querying for a Date Range (Specific Month or Day) v MongoDB Cookbook je veľmi dobré vysvetlenie, ale nižšie je niečo, čo som vyskúšal sám a zdá sa, že to funguje.
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)" }
Na základe mojich experimentov budete musieť serializovať dátumy do formátu, ktorý MongoDB podporuje, pretože nasledujúce dávalo nežiaduce výsledky vyhľadávania.
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" }
V druhom príklade sa neočakávali žiadne výsledky, ale napriek tomu sa jeden dostal. Je to preto, že sa vykonáva základné porovnávanie reťazcov.
MongoDB v skutočnosti ukladá milisekundy dátumu ako int(64), ako predpisuje http://bsonspec.org/#/specification.
Pri načítavaní dátumov to však môže byť dosť mätúce, pretože klientsky ovládač inštanciuje objekt dátumu s vlastným lokálnym časovým pásmom. Ovládač JavaScript v konzole mongo to určite urobí.
Ak vám teda záleží na časových pásmach, uistite sa, že viete, aké majú byť, keď ich získate späť. Pre dotazy by to nemalo'až tak záležať, pretože sa to stále bude rovnať rovnakému int(64), bez ohľadu na to, v akom časovom pásme sa nachádza váš dátumový objekt (dúfam). Ale určite by som'robil dotazy so skutočnými dátumovými objektmi (nie reťazcami) a nechal ovládač robiť svoju prácu.
skúšal som v tomto modeli podľa mojich požiadaviek, potrebujem uložiť dátum, keď sa niekedy vytvorí objekt, neskôr chcem získať všetky záznamy (dokumenty) medzi dvoma dátumami v mojom html súbore používal som nasledujúci formát mm/dd/rrrr
<!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>
v mojom py (python) súbore som ho previedol na "iso fomate" nasledujúcim spôsobom
date_str1 = request.POST["SelectedDate1"]
SelectedDate1 = datetime.datetime.strptime(date_str1, '%m/%d/%Y').isoformat()
a uložil do mojej dbmongo kolekcie s "SelectedDate" ako pole v mojej kolekcii
na získanie údajov alebo dokumentov medzi 2 dátumami som použil nasledujúci dotaz
db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}})