Home > front end >  Update first document via Update By Query API
Update first document via Update By Query API

Time:09-21

I'm trying to get Elasticsearch to do the same thing that MongoDB does with the findOneAndUpdate method, but this doesn't seem to be possible.

The use case is that multiple servers and threads will look into the specific index for the next task to complete.

Therefore my best bet would be to update the "next" task/document with a unique ID and then retrieve the document afterwards.

This query will give me the next document to retrieve:

GET /test_index/_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "next_id"
        }
      }
    }
  },
  "sort": {
    "next_update": {"order": "asc"}
  },
  "size": 1
}

But I can't seem to figure out how to use the Update By Query API to update only a single row. I've been trying this query, but it updates every found document:

POST /test_index/_update_by_query
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "next_id"
        }
      }
    }
  },
  "sort": {
    "next_update": {"order": "asc"}
  },
  "script": {
    "source": "ctx._source['next_update'] = params.next_id",
    "params": {
      "next_id": "xxxx"
    }
  }
}

How can I solve this?

CodePudding user response:

You can use max_docs param in _update_by_query and set value to 1 so it will be executed for only one document.

You can check this documentation.

POST /test_index/_update_by_query
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "next_id"
        }
      }
    }
  },
 "max_docs": 1,
  "sort": {
    "next_update": {"order": "asc"}
  },
  "script": {
    "source": "ctx._source['next_update'] = params.next_id",
    "params": {
      "next_id": "xxxx"
    }
  }
}
  • Related