Finde objekter, der er mellem to datoer MongoDB

Jeg har leget gemme tweets inde i mongodb, hvert objekt, der ser ud som dette:

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

Hvordan ville jeg skrive en forespørgsel, der kontrollerer created_at og finder alle objekter, der er mellem 18:47 og 19:00? Har jeg brug for at opdatere mine dokumenter, så de datoer, der er gemt i et bestemt format?

Du behøver ikke sige, om hvilke område du ønsker forespørgsel ?
Ups, jeg ønsker at søge created_at og finde alle er mellem to datoer.
Jeg er nysgerrig efter at hvorfor ikke anvende tidsstempel, nogen fordele ved hjælp af Dato Obj?
Den største fordel med Date-objekt over millisekunder siden epoken, eller hvad er menneskelig læsbarhed. I dette tilfælde, indstilling af start rækken for at 2010-04-29T00:00:00.000Z er meget lettere end at beregne den samme dato/tid i millisekunder. Du kan også gøre tidszone konvertering temmelig nemt. Også, Datoer, der allerede håndterer ting som spring dage, spring sekunder, og andre mærkværdigheder, som man normalt ikke ønsker at håndtere selv.

OriginalForfatteren Tom | 2010-05-31

10 svar

  1. 458

    At forespørge om et datointerval (Bestemt Måned eller Dag) MongoDB Kogebog har en meget god forklaring på sagen, men nedenfor er der noget jeg har prøvet selv, og det ser ud til at virke.

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

    Baseret på mine eksperimenter, du bliver nødt til at serialisere dine datoer i et format, der understøtter MongoDB, fordi det gav følgende uønskede søgeresultater.

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

    I det andet eksempel ingen resultater, som var forventet, men der var stadig en fået. Dette skyldes, at en grundlæggende streng sammenligning er udført.

    Ser interessant ud, men ikke den lagrede dato skal være i et bestemt format. Jeg har lige været lagret, hvad der var forudsat ved twitter, er dette skal ændres til et andet format?
    Du har sikkert gemt timestamps som strenge, så jeg gætte, MongoDB ikke indse, at de faktisk datoer. Således gør en række forespørgsel på dem, ville det resultere i en alfabetisk række forespørgsel (fx “Jan Mon 01.01.2010” er før “Jan Solen 01.01.1000”). Det ville nok give mening at formatere alle dato data i Cvs-format, som jeg mener er bare almindelig JavaScript Dato.
    Jeg har lige brugt det til at konvertere mine strenge til dato objekter, stackoverflow.com/questions/2900674/…
    Okay cool! Jeg vil gætte række forespørgsler, der er nævnt i kogebogen bør arbejde har du da ikke prøve dem ud allerede?
    Yep, når jeg var gemme datoer rette kogebog eksempler fungerede som forventet.

    OriginalForfatteren ponzao

  2. 19

    At afklare. Hvad er vigtigt at vide er, at:

    • Ja, du er nødt til at passere en Javascript-Date-objekt.
    • Ja, det har at være ISODate venligt
    • Ja, fra min erfaring med at få dette arbejde, er du nødt til at manipulere med dato til ISO
    • Ja, arbejder med datoer er som regel altid en kedelig proces, og mongo er ingen undtagelse

    Her er en, der arbejder kodestykke, hvor vi kan gøre en lille smule af dato manipulation for at sikre, Mongo (her bruger jeg desmerdyr modul og vil have resultater for rækker, hvis dato attribut er mindre end (før) den dato, der er angivet som myDate param) kan håndtere det korrekt:

    var inputDate = new Date(myDate.toISOString());
    MyModel.find({
        'date': { $lte: inputDate }
    })

    OriginalForfatteren arcseldon

  3. 16

    MongoDB, der faktisk gemmer den millis af en dato, som en int(64), som er ordineret af http://bsonspec.org/#/specification

    Men det kan få temmelig forvirrende, når du henter datoer, som kunden driver vil instantiere et date-objekt med sin egen lokale tidszone. JavaScript-driver i mongo-konsollen vil helt sikkert gøre dette.

    Så, hvis du holder af din tidszoner, så sørg for at du ved, hvad det er meningen at være, når du får den tilbage. Dette skal ikke så meget til de forespørgsler, som det vil stadig svarer til de samme int(64), uanset hvilken tidszone din date-objekt er (håber jeg). Men jeg ville helt sikkert lave forespørgsler med de faktiske dato objekter (ikke strings), og lad den driver, gøre sin ting.

    OriginalForfatteren Ben Smith

  4. 6
    db.collection.find({"createdDate":{$gte:new ISODate("2017-04-14T23:59:59Z"),$lte:new ISODate("2017-04-15T23:59:59Z")}}).count();

    Erstatte collection med navn på samling du ønsker at udføre forespørgslen

    Hvad gør denne tilføjelse til den accepterede svar (7 år tidligere)?
    være det ikke tilføje noget, men hvad er dit problem her ?
    Duplicate svar spilde folks tid.
    hvis du ikke kan lide det, skal du ignorere det, lære at give slip på ting, min ven

    OriginalForfatteren GSK

  5. 6

    Python og pymongo

    At finde objekter, der er mellem to datoer i Python med pymongo i indsamling posts (baseret på tutorial):

    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)

    Hvor {"$gte": from_date, "$lt": to_date} angiver intervallet i form af datetime.datetime typer.

    OriginalForfatteren Anton Tarasenko

  6. 3

    Bruge denne kode til at finde den registrering, der er mellem to datoer ved hjælp af $gte og $lt:

    db.CollectionName.find({"whenCreated": {
        '$gte': ISODate("2018-03-06T13:10:40.294Z"),
        '$lt': ISODate("2018-05-06T13:10:40.294Z")
    }});
    Hvad gør denne tilføjelse til den accepterede svar, forudsat 8 år tidligere?

    OriginalForfatteren Sunil Pal

  7. 2

    Konvertere dine datoer til GMT-tidszonen, som du er fyld dem i Mongo. På den måde er der aldrig en tidszone spørgsmål. Så bare gøre det math på twitter/tidszone-feltet, når du trækker data ud til en præsentation.

    OriginalForfatteren heregear

  8. 2

    Hvorfor ikke konvertere strengen til et tal mellem form ÅÅÅÅMMDDTTMMSS? Hver tilvækst af tid ville skabe en større tal, og du kan filtrere på heltal i stedet for at bekymre sig om at konvertere til ISO tid.

    Fordi tiden er det ikke bare sker i min lokale tidszone.
    Dette bliver til et mareridt, når du starter med at konvertere det tidspunkt, til og fra det format overalt. Hvis du kommer til at gøre noget som dette i det mindste bruge den værdi, der returneres fra .getTime() fra en JS date-objekt.
    thats hvorfor vi altid gemme data i UTC

    OriginalForfatteren ZacharyST

  9. 0

    jeg prøvede i denne model som per mine krav, jeg har brug for at gemme en dato, når et objekt oprettes senere, jeg ønsker at hente alle de poster (dokumenter), der er mellem to datoer
    i min html-fil
    jeg var ved hjælp af følgende format mm/dd/åååå

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

    i min py (python) fil jeg konverterede det til “iso fomate”
    i det følgende måde

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

    og gemt i min dbmongo samling med “SelectedDate”, som feltet i min samling

    til at hente data eller dokumenter mellem 2 datoer brugte jeg følgende forespørgsel

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

    OriginalForfatteren ayu for u

  10. -1

    bruge $gte og $lte at finde mellem dato data, der er i 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"),$lte: new Date(tomorrowDate + "T23:59:59.999Z")}})
    Lille slåfejl i dit svar $gte ikke $komme 🙂
    Undskyld jeg svarede meget træt tilstand, så jeg lavede fejl. Tak for din hjælp til at opdatere mit svar. du gjorde det godt job 🙂 @Bob

    OriginalForfatteren KARTHIKEYAN.A

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *