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