2015-02-26 4 views
5

Sto cercando di eseguire diversi inserimenti su una collezione esistente Mongo DB utilizzando il seguente codiceCome si aggiungono i risultati di aggregazione di Mongo DB a una raccolta esistente?

db.dados_meteo.aggregate([ 
        { $match : { "POM" : "AguiardaBeira" } }, 
        { $project : { 
        _id : { $concat: [ 
         "0001:", 
         { $substr: [ "$DTM", 0, 4 ] }, 
         { $substr: [ "$DTM", 5, 2 ] }, 
         { $substr: [ "$DTM", 8, 2 ] }, 
         { $substr: [ "$DTM", 11, 2 ] }, 
         { $substr: [ "$DTM", 14, 2 ] }, 
         { $substr: [ "$DTM", 17, 2 ] } 
         ] }, 
        "RNF" : 1, "WET":1,"HMD":1,"TMP":1 } }, 
        { $out : "dados_meteo_reloaded" } 
       ]) 

Ma ogni volta che cambio i $ partita parametri e fare una nuova aggregazione, Mongo DB cancella i precedenti documenti e inserisce il nuovo risultato.

Potrebbe aiutarmi?

+0

Possibile duplicato di [Come aggregare e unire il risultato in una raccolta?] (Https://stackoverflow.com/questions/20976569/how-to-aggregate-and-merge-the-result-into-a- collezione) – NatNgs

risposta

6

La risposta breve è "non si può":

Se la raccolta specificato dall'operazione $ fuori esiste già, quindi al termine dell'aggregazione, la fase $ fuori sostituisce l'attuale atomicamente collezione con la nuova collezione di risultati. L'operazione $ out non modifica alcun indice presente nella raccolta precedente. Se l'aggregazione fallisce, l'operazione $ out non modifica la collezione preesistente.

Per risolvere il problema, è possibile copiare il documento di raccolta specificato da $out ad una raccolta "permanente" subito dopo l'aggregazione, in uno dei pochi modi diversi (non di che è l'ideale se):

  • copyTo() è il più semplice, attenzione all'Avvertimento. Non usare altro per piccoli risultati.
  • Usa JS: db.out.find().forEach(function(doc) {db.target.insert(doc)})
  • Usa mongoexport/mongoimport
+14

non riesco a credere che non avevano un modo per aggiungere. e questo è un db che ha milioni di finanziamenti? patetico. – foreyez

+1

Ori, la tua risposta sembra buona. potresti voler modificarlo e aggiungere questa opzione http://stackoverflow.com/a/37433640/2834978. db.col1.insert (db.col2.aggregate (...). toArray()) –

1

non è la cosa più bella in assoluto, ma come un altro sintassi alternativa (da un archivio di post-elaborazione/accodare operazione) ...

db.targetCollection.insertMany(db.runCommand(
 
{ 
 
    aggregate: "sourceCollection", 
 
    pipeline: 
 
    [ 
 
     { $skip: 0 }, 
 
     { $limit: 5 }, 
 
     { 
 
      $project: 
 
      { 
 
       myObject: "$$ROOT", 
 
       processedDate: { $add: [new ISODate(), 0] } 
 
      } 
 
     } 
 
    ] 
 
}).result)

io non sono sicuro di come questo stack contro la variante forEach, ma io Fi E 'più intuitivo da leggere.