我有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中我必须清除或回收或休息一些东西,但我不知道是什么。
答案 0 :(得分:0)
布赖恩,
按此顺序尝试两件事:
myArray = applicationScope.application;
的第一行看起来不正确。我怀疑你实际上并没有在这里获得阵列。我想你只是从applicationScope获得第一个值。在print(myArray.length);
的下一行添加打印语句如果它总是等于1,那就是你的问题。您没有使用var
,您应该使用冒号将变量设置为某种java类型。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()
ViewNavigator
和getColumnValues()
。 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
。