new Date() in totale $progetto

Per una delle mie collezioni, che deve rimanere unix timestamp invece di isodate, io di solito convertire il timestamp con la nuova Data(unix_timestamp).

Ora ho bisogno di una new Date(ts) in un’aggregazione. (l’esempio è in PHP)

‘$progetto’ => array ( ‘giorno’ => ‘$nuova Data(ts)’, …

‘$gruppo’ => array ( “_id” => array(‘giorno’ => ‘$giorno)’, …),…

non arrivano i risultati. Il campo “giorno” il risultato è del tutto assente.

Come ottenere questo convertiti in aggregazione?

InformationsquelleAutor ledy | 2013-02-20



3 Replies
  1. 26

    per essere in grado di aggiungere un campo di tipo timestamp dal documento, si può fare questo, data:

    {"ts": 1400512120100}

    di aggregazione come una data:

    db.foo.aggregate({
       $project: {
           date: { $add: [new Date(0), "$ts"] }
       }
    })
    • Questo mi ha aiutato tanto! Il mio timestamp sono tutti in UTC e volevo convertire ora locale. Sono stato in grado di farlo utilizzando questo approccio. {$progetto: {gg: {$add:[nuova Data(0), { $sottrazione: [ {$moltiplicazione: [“$elementi.ordinato”, 1000]}, tzoffset ]}]}, …
    • Io la vedo in questo modo funziona, ma quello che sta succedendo qui? Solo > new Date(1400512120100) risultati, correttamente, in ISODate("2014-05-19T15:08:40.100Z"). Ma se si tenta di utilizzare new Date() in $project senza $add, si ottiene disallowed field type Date in object expression. Ancora chiaramente le date possono essere restituiti, per esempio. Se si tenta $add: [new Date("$ts")] in $project, si ottiene un grande anno negativo (ISODate("-292275055-05-16T16:47:03.192Z")). Come è $add trattamento, i tipi di dati correttamente e la restituzione di un ISODate senza errori?
    • Penso che la ragione new Date() non funziona è che new Date() viene eseguito solo una volta, prima che all’inizio della pipeline. Solo gli speciali di MongoDB “operatori di aggregazione” (come $add, $trunc etc.) verrà eseguito per ogni valore. Pertanto, se si desidera creare un momento di aggregazione, è necessario utilizzare uno di questi operatori. Poiché non vi è alcun operatore millisecondsToDate in MongoDB, è necessario (ab)uso $add.
    • Nota anche che $add: [new Date(0), "$ts"] funziona solo perché $add in particolare supporta l’aggiunta di millisecondi per una data.
    • Russel, scrivete a stackoverflow.com/questions/45488384/…
    • Ma se non ho tempo in mls

  2. 3

    Per ulteriori campi calcolati in proiezione è necessario utilizzare $operatore add, come questo:
    (esempio di console)

    db.so.aggregate([{$project: {date: {$add: Date() }}}])

    ma è sbagliato e si ottiene un messaggio di errore:

    exception: $add does not support strings (or dates)

    Ma ho trovato un semplice hack =)

    db.so.aggregate([{$project: {date: {$substr: [Date(), 0, -1] }}}])

    In questo caso avremo risultato atteso con date
    Inoltre, in output PHP si può vedere l’errore come questo:

    exception: disallowed field type Date in object expression (at 'date')

    E ora, la soluzione(php 5.4 sintassi):

    $so->aggregate([
        ['$project' => ["date" => ['$substr' => [new MongoDate(), 0, -1]] ] ]
    ]);
    • questo non convertire il campo ts’ valore in un mongo data. È solo accettando php numero o stringa come input, e non il valore della raccolta :/
    • Ops, sorry) Può essere opportuno utilizzare-ridurre la mappa, invece di aggregazione per questo caso?
    • questo è geniale! substr è perfetta per proiettare solo la data, l’eliminazione della parte del tempo. Questo è molto utile!!
  3. 0

    Di partenza Mongo 4.0, questo può essere ottenuto con la $toDate operatore di aggregazione:

    //{ "ts": 1400512120100 }
    db.collection.aggregate({ $project: { date: { $toDate: "$ts" } } })
    //{ "date": ISODate("2014-05-19T15:08:40.100Z") }

Lascia un commento