Xpages:获取视图中多值字段中的值计数

Xpages:获取视图中多值字段中的值计数,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我有100个带有多值字段的文档。该字段包含5个可能的值(Albert、Ben、Chris、Don、Ed)。该字段必须包含1个值,但最多可以包含5个值 我需要计算包含每个值的文档数,所以 Albert 56 Ben 22 Chris 79 等等 这似乎很容易。我构建了一个包含文档的视图,第一列是字段,我选择了显示多个提要的多个文档 在SSJS中,通过字段中的主值列表循环,并为每个值执行getDocumentByKey myArray = applicationScope.applica

我有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())
}
myArray=applicationScope.application;
var dc:NotesDocumentCollection;
对于(索引=0;索引
这将正确地获取第一个值,但之后没有。如果我只是硬编码一个特定的值,它就会工作。但是当我第二次调用getAllDocumentsByKey时,它没有返回正确的值

我认为这在LS中很好,但在SSJS中我必须清除或回收或休息一些东西,但我不知道是什么。

Bryan

按此顺序尝试两件事:

  • 您的第一行
    myArray=applicationScope.application看起来不对。我怀疑你实际上并没有得到一个数组。我认为您正从应用程序范围中获得第一个价值。在
    print(myArray.length)的下一行添加一个print语句如果它总是等于一,那就是你的问题。您没有使用
    var
    ,应该使用冒号将变量设置为某个java类型
  • 在for循环结束之前,尝试将集合设置为null<代码>dc=null这样您就可以确定在下一次迭代中您将获得一个新集合

  • 是否有任何多值字段值不明确
    getAllDocumentsByKey(向量)
    进行部分匹配。除非您想要这样做,否则我建议使用第二个参数并将其设置为
    true
    ,对于
    getAllEntriesByKey()
    ,始终如此


    另一种方法是在视图中添加一个total列,这无疑会提高性能。在视图索引中,这会对性能产生影响,但是您可以将
    ViewNavigator
    getColumnValues()
    getNextSibling()
    一起使用
    getCount()
    在LS中的性能非常差,几乎可以肯定在SSJS/Java中的性能也同样差。如果我理解正确的话,请看几年前的这篇博文:您想计算大量文档中可能出现的所有值,以得到一个5值列表,并对应5值计数,对吗?
    您可以循环浏览所有文档,循环浏览所有值,并向HashMap添加条目,其中值为key,int为value(每次都应该增加)。毕竟,您有一个包含5个值的映射,其中包含每个键的总和。

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


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

    或者在for循环的末尾尝试dc=null或dc.recycle()。此外,第一行看起来有些不对劲。您缺少var,并且没有为其指定类型。你确定你真的得到了一个数组吗?在循环之前,添加print(myArray.length)并确保长度正确。我猜你会有“1”,这解释了为什么你只看到第一个值。根据我的评论回答