Xpages: get count of values in multi-value field in view

I have 100 documents with a multi-value field. The field holds 5 possible values (Albert,Ben,Chris,Don,Ed) let's say. The field must contain 1 value, but can contain up to 5.

I need to compute the number of docs that contain each value, so

Albert 56
Ben    22
Chris  79 

и т.п.

This seemed easy. I constructed a view that contains the docs, the first column is the field, and I selected show multiple documents for multiple feeds.

In SSJS loop through my master list of values in the field, and for each one do a 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 ответа

Вы никогда не получите правильный ответ с getAllDocumentsByKey(), Когда документ отображается в одной категории, он будет отсутствовать в коллекции следующей категории. Вот как это работает.

использование ViewNavigator вместо. Постройте его по категориям и просто посчитайте ViewEntries,

Являются ли какие-либо из ваших многозначных значений полей неоднозначными? getAllDocumentsByKey(Vector) делает частичные совпадения. Если вы этого не хотите, я бы рекомендовал всегда использовать второй параметр и установить его в true, то же самое всегда для getAllEntriesByKey(),

Альтернативой, которая определенно будет работать лучше, будет добавление общего столбца в представление. В индексировании представлений наблюдается снижение производительности, но затем вы можете использовать ViewNavigator с getColumnValues() а также getNextSibling(), getCount() очень плохо работает в LS и почти наверняка будет так же плохо в SSJS/Java. Смотрите этот пост в блоге несколько лет назад http://www.intec.co.uk/why-you-shouldnt-count-on-a-notesviewnavigator/

Если я правильно понимаю: вы хотите подсчитать все значения, которые возможны по количеству документов, чтобы получить список из 5 значений с соответствующими значениями из 5 значений, верно? Вы можете циклически проходить по всем документам, проходить по всем значениям и добавлять записи в HashMap со значением в качестве ключа и значением int в качестве значения (которое следует увеличивать каждый раз). В конце концов, у вас есть карта с 5 значениями, содержащими суммы каждого ключа.

Брайан,

Две вещи, чтобы попробовать в этом порядке:

  1. Ваша первая строка myArray = applicationScope.application; не выглядит правильно. Я подозреваю, что вы на самом деле не получаете массив здесь. Я думаю, что вы просто получаете первое значение из вашего applicationScope. Добавьте оператор печати в следующую строку print(myArray.length); Если он всегда равен единице, это ваша проблема. Вы не используете var и вы должны установить переменную для некоторого типа Java, используя двоеточие.
  2. Перед завершением цикла for попробуйте установить для вашей коллекции значение null. dc = null; Таким образом, вы точно знаете, что получаете новую коллекцию на следующей итерации.
Другие вопросы по тегам