2016-12-30 10 views
1

Пожалуйста, обратите внимание на коллекцию MongoDB со следующим документом:Каким образом можно работать со сложными типами (списками и объектами) в Jaspersoft?

"_id": "clientsInfo" 
"data": { 
    "clientsList" : [ 
     { 
      "name" : "Mike", 
      "country" : "USA" 
     }, 
     ... 
    ] 
} 

После установки DataSet и определения запроса, как это ...

{ 
    collectionName:'projectA', 
    findQuery: { 
     '_id':'clientsInfo', 
    }, 
    findFields: { 
     '_id':0, 
     'data.clientsList':1 
    }, 
} 

... Я в состоянии отобразить первый элемент из извлеченного массива (java.util.List типа) в JasperSoft студии внутри текстового поля, используя следующее выражение:

$F{data.clientsList}.get(0) 

Бу t, учитывая, что я хотел бы показать все данные в таблице Name/Country ...

Question1: Как я могу получить доступ к любому из полей словаря? Попытка get method Я получаю The method get(String) is undefined for the type Object. Ошибка. Однако, зная, что объект является экземпляром com.mongodb.BasicDBObject, он должен иметь этот метод, наследуемый (см. doc).

Я также попытался наложить объект на org.json.JSONObject, но затем я получу net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: (JSONObject)$F{data.clientsList}.get(0).

Question2: Предположим, что мы уже решили первый вопрос ... Как я могу перебирать список для доступа не только к первому элементу, но и ко всем из них в соответствии с длиной массива? Можно ли использовать предложение for-loop внутри редактора выражений JasperSoft? (if-then-else seems to be available)

Заранее благодарен, любой ключ, который указывает мне в правильном направлении, будет оценен по достоинству.

+0

'Можно ли использовать предложение для цикла? - Что такое предложение цикла в JasperReports? –

+0

Некоторое выражение, которое позволяет мне определить самоинкрементную переменную для доступа к элементам массива от начала до конца, например 'get (i)'. –

ответ

0

На всякий случай кто-то был в той же ситуации, что и я, я должен сказать, что весь этот подход был неправильным.

Речь идет не о создании простого запроса, который возвращает большой блок сложных данных, отформатированных как объект или список объектов, а затем манипулировать им с помощью JasperSoft Studio. Вместо этого мне нужно было разработать более сложный запрос, который возвращает простые поля, которые я хотел использовать просто. Как это сделать? Используя Агрегационную Структуру.

Таким образом, путем изменения этого ...

{ 
    collectionName:'projectA', 
    findQuery: { 
     '_id':'clientsInfo', 
    }, 
    findFields: { 
     '_id':0, 
     'data.clientsList':1 
    }, 
} 

... для этого ...

{ 
    runCommand: { 
    aggregate : 'projectA', 
    pipeline : [ 
     {'$match': {'_id':'clientsInfo'}}, 
     {'$project': {'data.clientsList': 1}}, 
     {'$unwind': '$data'}, 
     {'$unwind': '$data.clientsList'} 
     ] 
    } 
} 

... как я получаю name и country поля для того, чтобы использовать их в текстовых полях, таблицах и т. д.