it-swarm.com.de

MongoDB/Mongoose, die zu einem bestimmten Datum abfragen?

Kann ich ein bestimmtes Datum abfragen?

Ich habe im Mongo-Kochbuch gefunden, dass wir es für einen Bereich tun können Abfragen nach einem Datumsbereich

db.posts.find({"created_on": {"$gte": start, "$lt": end}})

Aber ist es möglich für ein bestimmtes Datum? Das funktioniert nicht:

db.posts.find({"created_on": new Date(2012, 7, 14) })
111
Unitech

Das sollte funktionieren, wenn die Daten, die Sie in der Datenbank gespeichert haben, ohne Uhrzeit sind (nur Jahr, Monat, Tag).

Es besteht die Möglichkeit, dass das Datum, das Sie gespeichert haben, new Date() war, das die Zeitkomponenten enthält. Um diese Zeiten abzufragen, müssen Sie einen Datumsbereich erstellen, der alle Momente eines Tages enthält.

db.posts.find( //query today up to tonight
  {"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})
163
rdrey

Für diejenigen von uns, die Moment.js verwenden

const moment = require('moment')

const today = moment().startOf('day')

MyModel.find({
  createdAt: {
    $gte: today.toDate(),
    $lte: moment(today).endOf('day').toDate()
  }
})

Wichtig: alle Momente sind veränderbar !

tomorrow = today.add(1, 'days') funktioniert nicht, da es auch today mutiert. Der Aufruf von moment(today) löst dieses Problem, indem today implizit geklont wird.

93

Hast du es versucht:

db.posts.find({"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})

Das Problem, auf das Sie stoßen werden, ist, dass Datumsangaben als Zeitstempel in Mongo gespeichert werden. Um ein Datum zu finden, müssen Sie es mit einem Zeitstempel vergleichen. In Ihrem Fall glaube ich, dass Sie versuchen, einen Tag zu finden (z. B. von 00:00 bis 23:59 an einem bestimmten Datum). Wenn Ihre Daten ohne Zeiten gespeichert werden, sollten Sie in Ordnung sein. Andernfalls geben Sie Ihr Datum als Zeitbereich am selben Tag an (Start = 00: 00, Ende = 23: 59), wenn gte nicht funktioniert.

ähnliche Frage

6

Ja, das Datumsobjekt berechnet Datum und Uhrzeit, daher ist ein Vergleich mit dem Datumswert nicht möglich. 

Sie können einfach den Operator $ where verwenden, um komplexere Bedingungen mit dem booleschen Javascript-Ausdruck auszudrücken. :)

db.posts.find({ '$where': 'this.created_on.toJSON().slice(0, 10) == "2012-07-14"' })

created_on ist das Datumszeitfeld und 2012-07-14 ist das angegebene Datum.

Das Datum sollte genau im Format YYYY-MM-DD sein.

Hinweis: Verwenden Sie $where sparsam, was Auswirkungen auf die Leistung hat.

5
Faisal Hasnain

Sie können den folgenden Ansatz für die API-Methode verwenden, um Ergebnisse von bestimmten Tagen zu erhalten:

# [HTTP GET]
getMeals: (req, res) ->
  options = {}
  # eg. api/v1/meals?date=Tue+Jan+13+2015+00%3A00%3A00+GMT%2B0100+(CET)
  if req.query.date?
    date = new Date req.query.date
    date.setHours 0, 0, 0, 0
    endDate = new Date date
    endDate.setHours 23, 59, 59, 59
    options.date =
      $lt: endDate
      $gte: date

  Meal.find options, (err, meals) ->
      if err or not meals
        handleError err, meals, res
      else
        res.json createJSON meals, null, 'meals'
4
Daniel Kmak

Wir hatten ein Problem mit duplizierten Daten in unserer Datenbank, wobei ein Datumsfeld mehrere Werte enthielt, für die wir 1 festgelegt haben sollten.

Wir haben eine Sammlung namens "Daten" mit einem numerischen "Wert" -Feld und einem Datumsfeld "Datum". Wir hatten einen Prozess, den wir für idempotent hielten, addierten jedoch am zweiten Durchgang 2 x Werte pro Tag:

{ "_id" : "1", "type":"x", "value":1.23, date : ISODate("2013-05-21T08:00:00Z")}
{ "_id" : "2", "type":"x", "value":1.23, date : ISODate("2013-05-21T17:00:00Z")}

Wir brauchen nur 1 der 2 Datensätze, also mussten wir das Javascript umsetzen, um die Datenbank aufzuräumen. Unser ursprünglicher Ansatz bestand darin, die Ergebnisse zu durchlaufen und alle Felder mit einer Zeit zwischen 6 und 11 Uhr zu entfernen (alle Duplikate waren morgens), aber während der Implementierung wurde eine Änderung vorgenommen. Hier ist das Skript, mit dem es behoben wurde:

var data = db.data.find({"type" : "x"})
var found = [];
while (data.hasNext()){
    var datum = data.next();
    var rdate = datum.date;
    // instead of the next set of conditions, we could have just used rdate.getHour() and checked if it was in the morning, but this approach was slightly better...
    if (typeof found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] !== "undefined") {
       if (datum.value != found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()]) {
           print("DISCREPENCY!!!: " + datum._id + " for date " + datum.date);
       }
       else {
           print("Removing " + datum._id);
           db.data.remove({ "_id": datum._id});
       }
    }
    else {
       found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] = datum.value;
    }
}

und lief dann mit mongo thedatabase fixer_script.js

0
Brett