当前位置: 首页 > 面试题库 >

从数组elasticsearch中删除对象

柯乐池
2023-03-14
问题内容

我需要从满足条件的数组中删除对象,我可以根据条件更新数组的对象,如下所示:

PUT twitter/twit/1
{"list": 
     [
        {
            "tweet_id": "1",
            "a": "b"
        },
        {
            "tweet_id": "123",
            "a": "f"
        }
    ]
}

POST /twitter/twit/1/_update
{"script":"foreach (item :ctx._source.list) {
                if item['tweet_id'] == tweet_id) {
                      item['new_field'] = 'ghi';
                }
           }",
 "params": {tweet_id": 123"}
}

这正在工作

为了删除我正在这样做

POST /twitter/twit/1/_update
{ "script": "foreach (item : ctx._source.list) {
                    if item['tweet_id'] == tweet_id) {
                          ctx._source.list.remove(item); 
                    }
            }",
  "params": { tweet_id": "123" }
}

但这不起作用,并给出此错误,

ElasticsearchIllegalArgumentException [无法执行脚本];
嵌套:ConcurrentModificationException; 错误:ElasticsearchIllegalArgumentException
[无法执行脚本]; 嵌套:ConcurrentModificationException

我可以使用删除整个数组或整个字段

"script": "ctx._source.remove('list')"

我还可以通过使用指定对象的所有键来从数组中删除对象

"script":"ctx._source.list.remove(tag)",
     "params" : {
        "tag" : {"tweet_id": "123","a": "f"}

我的节点模块elasticsearch版本是2.4.2elasticsearch服务器是1.3.2


问题答案:

之所以会这样,是因为您尝试在遍历列表时修改列表,这意味着您想要更改对象列表,同时列出这些对象。

相反,您需要这样做:

POST /twitter/twit/1/_update
{
  "script": "item_to_remove = nil; foreach (item : ctx._source.list) { if (item['tweet_id'] == tweet_id) { item_to_remove=item; } } if (item_to_remove != nil) ctx._source.list.remove(item_to_remove);",
  "params": {"tweet_id": "123"}
}

如果您有多个符合条件的项目,请改用一个列表:

POST /twitter/twit/1/_update
{
  "script": "items_to_remove = []; foreach (item : ctx._source.list) { if (item['tweet_id'] == tweet_id) { items_to_remove.add(item); } } foreach (item : items_to_remove) {ctx._source.list.remove(item);}",
  "params": {"tweet_id": "123"}
}


 类似资料:
  • 问题内容: 文件: 有没有办法从数组中提取特定对象?IE如何从项数组中提取ID为23的整个项对象。 我努力了: 但是我很确定我没有正确使用’pull’。据我了解,pull将从数组中拉出字段,而不是对象。 关于如何将整个对象从数组中拉出的任何想法。 另外,我尝试在mongoose / nodejs中执行此操作,也不确定这种类型的内容是否在mongoose API中,但我找不到它。 问题答案: 尝试.

  • 问题内容: 我是ElasticSearch的新手。我试图弄清楚如何从ElasticSearch中删除数据。我已删除索引。但是,这似乎并没有真正删除数据本身。我看到的其他内容指向“ 按查询删除”功能。但是,我什至不知道要查询什么。我知道我的索引。本质上,我想弄清楚如何做 来自Chrome中的PostMan。但是,我没有任何运气。看来,无论我做什么,数据都会徘徊。到目前为止,我已经通过在PostMan

  • 问题内容: 如何从数组中删除对象?我想删除,其中包括名称的对象从。例如: 我要实现: 问题答案: 您可以使用多种方法从数组中删除项目: 如果要删除position处的元素,请使用: 要么 您可以使用或结合使用参见MDN从数组中删除一个或多个元素,例如

  • 问题内容: 我有一个这样的对象数组: 我知道我可以找到匹配的项目,如下所示: 但是现在如何将其从原始文件中删除?我希望可以以某种方式返回索引,以便可以使用。或者更好的是,我想做这样的事情: 有任何想法吗? 问题答案: 您不了解的是Array是一个结构,因此 是一个值类型 。它不能像类实例那样在适当位置进行突变。因此,即使您扩展Array来编写一个变异方法,您也将始终在幕后创建一个新的数组。 因此,

  • 问题内容: 在我的应用程序中,选择单元格时在数组中添加了一个对象,重新选择单元格时取消选择并删除了对象。我使用了该代码,但给了我错误。 它给了我2像这样的错误: 问题答案: 雨燕等同的是: 如果对象是唯一的 。完全没有必要强制使用 该API 也可以使用,但这会导致不必要的隐式桥强制转换为。 如果同一对象多次出现,请使用。但是,在像数据源数组这样的情况下,将索引与特定对象相关联的情况是可取的,因为它

  • 我是mongoDB新手,在使用Mongoose从mongoDB中的数组中删除团队对象时遇到困难。我的用户收藏看起来像; 我的移除路线看起来像; 控制台在用户之前和之后记录日志。更新是完全相同的,我没有得到任何错误抛出。控制台的输出。日志(错误、数据)最终被删除 我不知道该怎么解释。我也尝试过不按这里的建议传入userID;https://stackoverflow.com/a/24289161/5