2015-09-08 17 views
6

Iam using groovy scripting sotto SpagoBI. Voglio usare l'aggregazione. Voglio ad esempio per eseguire la seguente aggregazione:MongoDb: Aggregation using Groovy language

db.myCollection.aggregate(
    [ 
     { 
     $group : { 
      _id : { day: { $dayOfMonth: "$recvTime" } } 

     } 
     } 
    ] 
) 

ho provato:

DBObject projectFields = new BasicDBObject('$dayOfMonth',"recvTime"); 
DBObject project=new BasicDBObject('$project',projectFields) 

DBObject groupFields = new BasicDBObject("_id",project); 

DBObject group = new BasicDBObject('$group', groupFields); 

iterable = db.getCollection('myCollection').aggregate(group) 

ho ottenuto questo errore:

An unexpected error occured while executing dataset: { "serverUsed" : "192.168.1.160:27017" , "errmsg" : "exception: invalid operator '$project'" , "code" : 15999 , "ok" : 0.0} 

Tutte le idee?

Aggiornamenti: la query eseguita in Mongo Shell

db['cygnus_/kurapath_enocean_power_enocean'].aggregate(
... [ 
...  { 
...   $group : { 
...   _id : { day: { $dayOfMonth: "$recvTime" } } 
...   } 
...  } 
... ] 
...); 
{ "_id" : { "day" : 9 } } 
{ "_id" : { "day" : 8 } } 
{ "_id" : { "day" : 7 } } 
{ "_id" : { "day" : 4 } } 
{ "_id" : { "day" : 3 } } 

i dati memorizzati in Mongo DB:

db['cygnus_/kurapath_enocean_power_enocean'].find() 
{ "_id" : ObjectId("55e81e9631d7791085668331"), "recvTime" : ISODate("2015-09-03T10:19:02Z"), "attrName" : "power", "attrType" : "string", "attrValue" : "2085.0" } 
{ "_id" : ObjectId("55e81e9631d7791085668332"), "recvTime" : ISODate("2015-09-03T10:19:02Z"), "attrName" : "power", "attrType" : "string", "attrValue" : "2085.0" } 
{ "_id" : ObjectId("55e81e9831d7791085668333"), "recvTime" : ISODate("2015-09-03T10:19:04Z"), "attrName" : "power", "attrType" : "string", "attrValue" : "2077.0" } 

risposta

1

Da l'errore, l'aggregazione non si aspetta l'operatore $project in modo da dovrebbe cambiare le variabili projectFields e project per mostrare le effettive espressioni della pipeline, ad esempio

DBObject dateFields = new BasicDBObject("$dayOfMonth", "$recvTime"); 
DBObject dateObject = new BasicDBObject("day", dateFields); 

DBObject groupFields = new BasicDBObject("_id", dateObject); 
DBObject group = new BasicDBObject('$group', groupFields); 

iterable = db.getCollection('myCollection').aggregate(group); 
+0

Ho provato il tuo codice ma ho ricevuto un nuovo errore :(: 'Si è verificato un errore imprevisto durante l'esecuzione del set di dati: Nessuna proprietà: dayOfMonth per la classe: Script119' quando ho provato 'DBObject dateFields = new BasicDBObject ('$ dayOfMonth'," recvTime ");' Ho ottenuto ' Si è verificato un errore imprevisto durante l'esecuzione del set di dati: {" serverUsed ":" 192.168.1.160:27017 "," errmsg ":" eccezione: impossibile convertire da tipo BSON da stringa a data "," codice ": 16006," ok ": 0.0}' – sabrina2020

+0

Hai dimenticato di includere '$' nel tuo campo "recvTime" ', quindi cambia la riga' DBObject dateFields = new BasicDBObject ('$ dayOfMonth', "recvTime") 'a' DBObject dateFields = new BasicDBObject ('$ dayOfMonth ', "$ recvTime") '. – chridam

+0

Ho aggiornato il codice in 'DBObject dateFields = new BasicDBObject ('$ dayOfMonth'," $ recvTime ")' ma ho ricevuto questo errore 'Si è verificato un errore imprevisto durante l'esecuzione del set di dati: Nessuna proprietà: recvTime per classe', se ho aggiornato a 'DBObject dateFields = new BasicDBObject ('$ dayOfMonth', '$ recvTime');' Ho ottenuto un set di risultati vuoto – sabrina2020

0

In SpagoBI si hanno 2 modi per creare un set di dati di tipo MongoDB: 1) utilizzare un set di dati di tipo di query e utilizzare un linguaggio JS 2) utilizzare un set di dati di tipo di classe Java e scrivere il codice in Java Per la soluzione 1 è necessario creare un set di dati di tipo query, selezionare un'origine dati MongoDB e scrivere nel campo QUERY la query in js seguendo le specifiche scritte qui (http://wiki.spagobi.org/xwiki/bin/view/spagobi_server/data_set#HQueryDataSet28Mongo29)

Il pulsante "Modifica script" viene utilizzato per modificare la query stringa e puoi trovare qualche consiglio nella wiki. Quindi, se la query è SQL è possibile utilizzare uno script Groovy js o per modificare la stringa di query (ad esempio applicare un po 'di logica per creare parametri o nomi di tabella)

È possibile esprimere la query in questo modo:

Var query = db.myCollection.aggregate(
    [ 
     { 
     $group : { 
      _id : { day: { $dayOfMonth: "$recvTime" } } 

     } 
     } 
    ] 
)