Xpages:在视图

时间:2015-11-13 20:16:03

标签: xpages xpages-ssjs

我有100个带有多值字段的文档。该字段包含5个可能的值(Albert,Ben,Chris,Don,Ed)。该字段必须包含1个值,但最多可包含5个。

我需要计算包含每个值的文档数量,所以

Albert 56
Ben    22
Chris  79 

等。

这看起来很容易。我构建了一个包含文档的视图,第一列是字段,我选择了显示多个文档的多个文档。

在SSJS中循环遍历我在字段中的主值列表,并为每个人执行getDocumentByKey。

myArray = applicationScope.application;     
var dc:NotesDocumentCollection;

for (index = 0; index < myArray.length; ++index) {
      dc = view1.getAllDocumentsByKey(myArray[index]);  
   Print(dc.getCount())
}

这会正确获取第一个值,但之后没有。如果我只是硬编码一个特定的值,它就可以了。但是当我第二次调用getAllDocumentsByKey时,它不会返回正确的值。

我认为这在LS中可以正常工作,但在SSJS中我必须清除或回收或休息一些东西,但我不知道是什么。

4 个答案:

答案 0 :(得分:0)

布赖恩,

按此顺序尝试两件事:

  1. myArray = applicationScope.application;的第一行看起来不正确。我怀疑你实际上并没有在这里获得阵列。我想你只是从applicationScope获得第一个值。在print(myArray.length);的下一行添加打印语句如果它总是等于1,那就是你的问题。您没有使用var,您应该使用冒号将变量设置为某种java类型。
  2. 在for循环结束之前,尝试将集合设置为null。 dc = null;这样您就可以确定在下一次迭代中获得了新的集合。

答案 1 :(得分:0)

您的多值字段值是否有歧义? elasticsearch.msearch({ index: 'some_index', body: [ { _type: 'type_a', _source_exclude: ['field_a', 'field_b'].join() }, {query: {constant_score: {filter: {term: {field_c: valueA}}}}}, { _type: 'type_b', _source_exclude: ['field_d', 'field_e'].join() }, {query: {constant_score: {filter: {term: {field_f: valueB}}}}} ] }, function msearch(err, results) { /* logic... */ }); 会进行部分匹配。除非你想要,否则我建议始终使用第二个参数并将其设置为getAllDocumentsByKey(Vector),同样始终用于true

替代方案肯定会表现得更好,就是在视图中添加一个总列。视图索引会对性能产生影响,但您可以使用getAllEntriesByKey() ViewNavigatorgetColumnValues()getNextSibling()在LS中表现极差,并且几乎肯定会在SSJS / Java中表现不佳。几年前查看此博客文章http://www.intec.co.uk/why-you-shouldnt-count-on-a-notesviewnavigator/

答案 2 :(得分:0)

如果我明白这一点:你想要计算一定数量的文件中可能存在的所有值,以获得具有相应的5个值计数的5值列表,对吧? 您可以循环遍历所有文档,遍历所有值并将条目添加到HashMap,其值为key,int为value(应每次都增加)。毕竟你有一个包含5个值的Map,其中包含每个键的总和。

答案 3 :(得分:0)

getAllDocumentsByKey()永远无法得到正确答案。当文档显示在一个类别中时,它将在下一个类别的集合中丢失。这就是它的工作方式。

请改用ViewNavigator。按类别构建,只需count ViewEntries