MongoDb: Агрегация с использованием языка Groovy
Я использую скрипты Groovey под SpagoBI. Я хочу использовать агрегацию. Я хочу, например, выполнить следующую агрегацию:
db.myCollection.aggregate(
[
{
$group : {
_id : { day: { $dayOfMonth: "$recvTime" } }
}
}
]
)
Я старался:
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)
Я получил эту ошибку:
An unexpected error occured while executing dataset: { "serverUsed" : "192.168.1.160:27017" , "errmsg" : "exception: invalid operator '$project'" , "code" : 15999 , "ok" : 0.0}
Есть идеи?
Обновления: запрос выполняется в оболочке Mongo
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 } }
данные хранятся в монго дБ:
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" }
2 ответа
Из-за ошибки агрегация не ожидает $project
оператор, поэтому вы должны изменить projectFields
а также project
переменные для отображения фактических выражений конвейера, т.е.
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);
В SpagoBI у вас есть 2 способа создать набор данных типа MongoDB: 1) использовать набор данных типа Query и использовать язык JS 2) использовать набор данных типа java class и написать свой код в java Для решения 1 вы должны создать набор данных из введите query, выберите источник данных MongoDB и напишите в поле QUERY запрос в js, следуя приведенной здесь спецификации ( http://wiki.spagobi.org/xwiki/bin/view/spagobi_server/data_set)
Кнопка "Редактировать скрипт" используется для изменения строки запроса, и вы можете найти некоторые подсказки в вики. Поэтому, если запрос является SQL, вы можете использовать js o groovy скрипт для изменения строки запроса (например, применить некоторую логику для создания параметров или имен таблиц)
Вы можете выразить свой запрос следующим образом:
Var query = db.myCollection.aggregate(
[
{
$group : {
_id : { day: { $dayOfMonth: "$recvTime" } }
}
}
]
)