Trouver des objets entre deux dates MongoDB

j'ai joué à stocker des tweets à l'intérieur de mongodb, chaque objet ressemble à ceci:

{
"_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
}

Comment écrire une requête qui vérifie le created_at et trouve tous les objets entre 18:47 et 19:00? Dois-je mettre à jour mes documents pour que les dates soient stockées dans un format spécifique?

281
demandé sur royhowie 2010-05-31 15:34:43

10 réponses

l'Interrogation d'une Plage de dates Spécifique (le Mois ou le Jour) dans le MongoDB livre de cuisine a une très bonne explication sur la question, mais au-dessous est quelque chose que j'ai essayé moi-même et il semble fonctionner.

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)" }

basé sur mes expériences, vous aurez besoin de sérialiser vos dates dans un format que MongoDB supporte, parce que ce qui suit a donné des résultats de recherche indésirables.

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" }

dans le deuxième exemple aucun résultat n'était attendu, mais il y avait encore un obtenu. C'est parce qu'une comparaison de chaîne de base est faite.

442
répondu ponzao 2016-09-02 13:54:20

pour clarifier. Ce qu'il est important de savoir, c'est que:

  • Oui, vous devez passer un objet Date Javascript.
  • Oui, il doit être ISODate friendly
  • Oui, mon expérience se présente au travail, vous avez besoin de manipuler la date de l'ISO
  • Oui, Travailler avec des dates est généralement toujours un processus fastidieux, et mongo ne fait pas exception

Voici une extrait de code, où nous faisons un peu de manipulation de date pour assurer Mongo (ici, j'utilise le module Mangoose et je veux des résultats pour les lignes dont l'attribut date est inférieur à (avant) la date indiquée comme myDate param) peut le gérer correctement:

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})
19
répondu arcseldon 2014-07-30 15:34:18

MongoDB stocke effectivement le millis d'une date en tant que int(64), comme prescrit par http://bsonspec.org/#/specification

cependant, il peut devenir assez confus lorsque vous récupérez des dates car le pilote client instanciera un objet date avec son propre fuseau horaire local. Le pilote JavaScript de la console mongo le fera certainement.

donc, si vous vous souciez de vos fuseaux horaires, alors assurez-vous de savoir ce que c'est supposé lorsque vous le récupérez. Cela ne devrait pas avoir beaucoup d'importance pour les requêtes, car cela équivaudra toujours au même int(64), quel que soit le fuseau horaire dans lequel se trouve votre objet date (j'espère). Mais je ferais certainement des requêtes avec des objets date réels (pas des chaînes) et laisserais le pilote faire son truc.

16
répondu Ben Smith 2010-06-03 20:22:54
db.collection.find({"createdDate":{$gte:new ISODate("2017-04-14T23:59:59Z"),$lte:new ISODate("2017-04-15T23:59:59Z")}}).count();

remplacer collection par le nom de la collection que vous voulez exécuter query

6
répondu GSK 2017-09-07 01:01:59

Python et pymongo

trouver des objets entre deux dates en Python avec pymongo dans la collection posts (basé sur le" tutoriel ):

from_date = datetime.datetime(2010, 12, 31, 12, 30, 30, 125000)
to_date = datetime.datetime(2011, 12, 31, 12, 30, 30, 125000)

for post in posts.find({"date": {"$gte": from_date, "$lt": to_date}}):
    print(post)

{"$gte": from_date, "$lt": to_date} spécifie la gamme en termes de types datetime.datetime .

5
répondu Anton Tarasenko 2018-01-16 13:24:33

utilisez ce code pour trouver l'enregistrement entre deux dates en utilisant $gte et $lt :

db.CollectionName.find({"whenCreated": {
    '$gte': ISODate("2018-03-06T13:10:40.294Z"),
    '$lt': ISODate("2018-05-06T13:10:40.294Z")
}});
3
répondu Sunil Pal 2018-05-17 08:52:36

Convertissez vos dates en fuseau horaire GMT comme vous les bourrez en Mongo. Comme ça, il n'y aura jamais de problème de fuseau horaire. Ensuite, il suffit de faire le calcul sur le champ twitter/timezone lorsque vous retirez les données pour la présentation.

2
répondu heregear 2014-03-26 14:24:23

pourquoi ne pas convertir la chaîne en un entier de la forme YYYYMMDDHHMMSS? Chaque incrément de temps créerait alors un entier plus grand, et vous pouvez filtrer sur les entiers au lieu de vous soucier de convertir en temps ISO.

2
répondu ZacharyST 2015-08-04 18:17:01

j'ai essayé dans ce modèle selon mes exigences je dois stocker une date quand un objet est créé plus tard je veux récupérer tous les dossiers (documents ) entre deux dates dans mon fichier html j'utilisais le format suivant mm/jj / aaaa

<!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>

dans mon fichier PY (python) je l'ai converti en " iso fomate" de la manière suivante

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

et enregistré dans ma collection dbmongo avec "SelectedDate" comme champ dans ma collection

pour récupérer des données ou des documents entre 2 dates j'ai utilisé la requête suivante

db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}})
0
répondu ayu for u 2013-12-04 11:29:29

utiliser $get et $lt à trouver entre la date des données dans mongodb

var tomorrowDate = moment(new Date()).add(1, 'days').format("YYYY-MM-DD");
db.collection.find({"plannedDeliveryDate":{ $gte: new Date(tomorrowDate +"T00:00:00.000Z"),$lt: new Date(tomorrowDate + "T23:59:59.999Z")}})
0
répondu KARTHIKEYAN.A 2017-12-07 12:53:56