559 Stimmen

Objekte zwischen zwei Daten suchen MongoDB

Ich habe herumgespielt Speichern von Tweets in Mongodb, jedes Objekt sieht wie folgt aus:

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

Wie würde ich eine Abfrage schreiben, die die erstellt_am und findet alle Objekte zwischen 18:47 und 19:00? Muss ich meine Dokumente aktualisieren, damit die Datumsangaben in einem bestimmten Format gespeichert werden?

0 Stimmen

Sie sagen nicht, über welches Feld Sie eine Abfrage wünschen?

1 Stimmen

Ups, ich möchte das created_at abfragen und alles zwischen zwei Daten finden.

0 Stimmen

Ich bin neugierig, dass, warum nicht verwenden Sie Zeitstempel, alle Vorteile durch die Verwendung des Date Obj?

6voto

KARTHIKEYAN.A Punkte 14230

Verwenden. $gte y $lte zwischen Datumsdaten in Mongodb zu finden

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

1 Stimmen

Kleiner Tippfehler in Ihrer Antwort $gte nicht $get :)

1 Stimmen

Tut mir leid, dass ich in sehr müdem Zustand geantwortet habe, deshalb habe ich einen Fehler gemacht. Danke für deine Hilfe, meine Antwort zu aktualisieren. du hast gute Arbeit geleistet :) @Bob

6voto

Jitendra Punkte 21
mongoose.model('ModelName').aggregate([
    {
        $match: {
            userId: mongoose.Types.ObjectId(userId)
        }
    },
    {
        $project: {
            dataList: {
              $filter: {
                 input: "$dataList",
                 as: "item",
                 cond: { 
                    $and: [
                        {
                            $gte: [ "$$item.dateTime", new Date(`2017-01-01T00:00:00.000Z`) ]
                        },
                        {
                            $lte: [ "$$item.dateTime", new Date(`2019-12-01T00:00:00.000Z`) ]
                        },
                    ]
                 }
              }
           }
        }
     }
])

5voto

Gabriel Guérin Punkte 210

Für diejenigen, die Integromat und MongoDB : Ich habe nach dem richtigen Weg gesucht, um alle Datensätze zwischen zwei Daten abzufragen. Am Ende musste ich nur die Option ISODate wie in einigen der hier vorgeschlagenen Lösungen. Der vollständige Code würde also lauten:

"created": {
    "$gte": "2016-01-01T00:00:00.000Z",
    "$lt": "2017-01-01T00:00:00.000Z"
}

Diese Artikel mir geholfen, mein Ziel zu erreichen.

3voto

ZacharyST Punkte 628

Warum wird die Zeichenkette nicht in eine Ganzzahl der Form JJJJMMTTHHMMSS umgewandelt? Jedes Zeitinkrement würde dann eine größere Ganzzahl erzeugen, und Sie können nach den Ganzzahlen filtern, anstatt sich um die Konvertierung in ISO-Zeit zu kümmern.

1 Stimmen

Denn die Zeit spielt sich nicht nur in meiner lokalen Zeitzone ab.

2 Stimmen

Das wird zu einem Albtraum, wenn man anfängt, die Zeit überall in dieses Format zu konvertieren und wieder zurück. Wenn Sie gehen, um so etwas zu tun, zumindest verwenden Sie den Rückgabewert von .getTime() von einem JS Datum Objekt.

1 Stimmen

Aus diesem Grund speichern wir Daten immer in UTC

3voto

heregear Punkte 57

Konvertieren Sie Ihre Daten in die GMT-Zeitzone, wenn Sie sie in Mongo einfügen. Auf diese Weise gibt es nie ein Problem mit der Zeitzone. Dann tun Sie einfach die Mathematik auf dem Twitter/Zeitzone Feld, wenn Sie die Daten wieder für die Präsentation herausziehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X