请考虑使用以下文档的MongoDB集合:
"_id": "clientsInfo"
"data": {
"clientsList" : [
{
"name" : "Mike",
"country" : "USA"
},
...
]
}
设置DataSet并定义Query之后......
{
collectionName:'projectA',
findQuery: {
'_id':'clientsInfo',
},
findFields: {
'_id':0,
'data.clientsList':1
},
}
...我可以使用以下表达式在文本字段内的JasperSoft Studio中显示获取数组的第一项(java.util.List
类型):
$F{data.clientsList}.get(0)
但是,考虑到我想在名称/国家/地区表中展示整个数据......
问题1 :我如何访问任何字典字段?尝试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)
错误。
问题2 :假设我们已经解决了第一个问题......我如何迭代列表不仅可以访问第一个项目,还可以根据数组长度访问所有项目?是否可以在JasperSoft表达式编辑器中使用for-loop语句? (if-then-else seems to be available)
在此先感谢,任何指出我正确方向的线索都将受到赞赏。
答案 0 :(得分: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
字段以便在文本字段,表格等中使用它们的方式。