如何使用自定义对象作为键创建HashMap?

如何使用自定义对象作为键创建HashMap?,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,在Elasticsearch中,我有一个包含对象数组的对象。数组中的每个对象都有类型,id,更新时间,值字段 我的输入参数是一个数组,它包含相同类型但不同值和更新时间的对象。当对象存在时,我想用新值更新它们,当它们不存在时,我想创建新的对象 我想使用无痛脚本来更新它们,但要保持它们的不同,因为其中一些可能会重叠。问题是我需要同时使用type和id来保持它们的唯一性。到目前为止,我已经使用了bruteforce方法,嵌套for循环并比较了两个数组的元素,但我对此不太满意 其中一个想法是从源代码中获

在Elasticsearch中,我有一个包含对象数组的对象。数组中的每个对象都有
类型
id
更新时间
字段

我的输入参数是一个数组,它包含相同类型但不同值和更新时间的对象。当对象存在时,我想用新值更新它们,当它们不存在时,我想创建新的对象

我想使用无痛脚本来更新它们,但要保持它们的不同,因为其中一些可能会重叠。问题是我需要同时使用
type
id
来保持它们的唯一性。到目前为止,我已经使用了bruteforce方法,嵌套
for
循环并比较了两个数组的元素,但我对此不太满意

其中一个想法是从源代码中获取数组,构建临时HashMap进行快速查找,处理输入,然后将所有对象存储回源代码中

我可以用自定义对象(具有
type
id
的类)作为键创建HashMap吗?如果是,怎么做?我无法将类定义添加到脚本中

这是地图。所有字段都是“禁用”的,因为我只将它们用作中间状态,并使用其他字段进行查询

{
“财产”:{
“arrayOfObjects”:{
“财产”:{
“典型”:{
“已启用”:false
},
“id”:{
“已启用”:false
},
“价值”:{
“已启用”:false
},
“更新”:{
“已启用”:false
}
}
}
}
}
示例文档

{
“arrayOfObjects”:[
{
“典型”:“a”,
“id”:“1”,
“更新”:“2020-01-02T10:10:10Z”,
“值”:“是”
},
{
“典型”:“a”,
“id”:“2”,
“更新”:“2020-01-02T11:11:11Z”,
“值”:“否”
},
{
“类型”:“b”,
“id”:“1”,
“更新”:“2020-01-02T11:11:11Z”
}
]
}
最后是脚本的当前形式的一部分。这个脚本还做了一些其他的事情,所以为了简洁起见,我把它们删掉了

if(ctx.\u source.arrayOfObjects==null){
ctx._source.arrayOfObjects=新的ArrayList();
}
for(参数inputObjects中的对象){
def found=false;
对于(ctx中的现有对象。\u source.arrayOfObjects){
if(obj.typ==existingObj.typ&&obj.id==existingObj.id&&isAfter(obj.updated,existingObj.updated)){
existingObj.updated=obj.updated;
existingObj.value=obj.value;
发现=真;
打破
}
}
如果(!找到){
ctx._source.arrayOfObjects.add([
“类型”:对象类型,
“id”:对象id,
“值”:参数inputValue,
“更新”:对象已更新
]);
}
}

从技术上讲,您的方法没有任何不理想之处

HashMap
可能会节省一些时间,但由于您正在编写脚本,您已经注定了它固有的低效性。。。顺便说一句,您可以初始化并使用HashMaps

另一种方法是重新考虑数据结构——而不是使用键控对象或类似的对象数组。对象数组不适合频繁更新


最后一个提示:您说过这些字段仅用于存储某些中间状态。如果情况不是这样(或者将来不会这样),我建议使用数组独立于数据库中的其他对象进行查询

你的脚本现在看起来像什么?你也能分享一些文档吗?映射的相关部分也很好。希望这足够了。如果需要的话,我很乐意添加更多。谢谢,这很有帮助。谢谢你的回答,我可能就到此为止了。在ES中创建动态键有它自己的问题,我喜欢这种数据结构的简单性。关于文档,虽然我知道,但我不清楚如何创建多值密钥。文档中只有现有的类型。主要问题是如何创建具有多个值(这里是type和id)的键?从技术上讲,我可以将它们连接起来,但我认为拥有对象会更优雅。