elasticsearch,Node.js,elasticsearch" /> elasticsearch,Node.js,elasticsearch" />

Node.js 如何动态更新文档的字段?

Node.js 如何动态更新文档的字段?,node.js,elasticsearch,Node.js,elasticsearch,我正在构建一个用于存储电影/电视标题的基本crud应用程序。我正在使用elasticsearch的2.4.4版,因为我的项目经理选择了这个版本。我正在使用express框架和本机elasticsearch nodejs驱动程序 目前,对于“title”类型的“titles”索引,这就是我的映射 我希望在我的服务器上有一个端点,可以通过其id更新文档。这是我迄今为止为该端点“POST/api/titles/:titleID/updateTitleByID”所做的 我想要实现的是用我从req.bod

我正在构建一个用于存储电影/电视标题的基本crud应用程序。我正在使用elasticsearch的2.4.4版,因为我的项目经理选择了这个版本。我正在使用express框架和本机elasticsearch nodejs驱动程序

目前,对于“title”类型的“titles”索引,这就是我的映射

我希望在我的服务器上有一个端点,可以通过其id更新文档。这是我迄今为止为该端点“POST/api/titles/:titleID/updateTitleByID”所做的

我想要实现的是用我从req.body中得到的内容更新文档。例如,如果我从请求主体中获得一个seriesName I。这只是我想要更新的内容,其余的都保持不变。我如何做到这一点

编辑:这是完整的堆栈跟踪

Error: [remote_transport_exception] [Agon][127.0.0.1:9300][indices:data/write/update[s]]
    at respond (/home/natealcedo/Projects/digitalfolks.hooq/node_modules/elasticsearch/src/lib/transport.js:289:15)
    at checkRespForFailure (/home/natealcedo/Projects/digitalfolks.hooq/node_modules/elasticsearch/src/lib/transport.js:248:7)
    at HttpConnector.<anonymous> (/home/natealcedo/Projects/digitalfolks.hooq/node_modules/elasticsearch/src/lib/connectors/http.js:164:7)
    at IncomingMessage.wrapper (/home/natealcedo/Projects/digitalfolks.hooq/node_modules/lodash/lodash.js:4968:19)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:186:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickDomainCallback (internal/process/next_tick.js:122:9)
错误:[远程传输例外][Agon][127.0.0.1:9300][索引:数据/写入/更新]]
在respond(/home/natealcedo/Projects/digitalpeoples.hooq/node_modules/elasticsearch/src/lib/transport.js:289:15)
checkRespForFailure(/home/natealcedo/Projects/digitalpeoples.hooq/node_modules/elasticsearch/src/lib/transport.js:248:7)
在HttpConnector上。(/home/natealcedo/Projects/digitalpeoples.hooq/node_modules/elasticsearch/src/lib/connectors/http.js:164:7)
在IncomingMessage.wrapper(/home/natealcedo/Projects/digitalpeoples.hooq/node_modules/lodash/lodash.js:4968:19)
在emitNone(events.js:91:20)
在IncomingMessage.emit(events.js:186:7)
在endReadableNT(_stream_readable.js:974:12)
at _combinedTickCallback(内部/流程/下一步_tick.js:74:11)
在进程中。_tickDomainCallback(internal/process/next_tick.js:122:9)

如果要更新单个文档,不需要使用“按查询更新”端点,因为它支持,这正是您所追求的。您需要使用以下选项:

如果仅当
isDeleted
标志为false时才需要更新文档,则可以使用相同的API调用,但使用脚本,如下所示:

titlesController.updateDocByID = function(req,res){
  const titleID = req.params.titleID;
  const partialFields = req.body;
  // TODO do some validations on the received fields
  es.update({
    index: "titles",
    type: "title",
    id: titleID,
    body: {
      script: "if (!ctx._source.isDeleted) { ctx._source.putAll(params.partialFields) }",
      params: {partialFields: partialFields}
    }}).then(results => {
      logger.info(results);
      res.status(200).json({
        message: "OK"
      });
    }).catch(err => {
      logger.error(err);
      res.status(500).json({
        error: "Internal server error"
      });
    });
};

如果您使用第二种方法,则需要在
elasticsearch.yml
配置文件中输入。非常感谢!:)你能告诉我脚本编写的方向吗?我不知道有一个方法。putall
ctx。_source
指的是源文档,它是一个Java映射,因此在Groovy中可以使用
putall
方法。嘿,对不起,你能帮我一下吗?当我尝试你的方法时,它抛出了一个错误:[remote_transport_exception][Agon][127.0.0.1:9300][index:data/write/update[s]]我很困惑,因为你在第一条评论中说它有效?!请随时用完整的堆栈跟踪更新您的问题。我实际上认为它会起作用。我从未真正测试过它。我整天都不在电脑前处理其他事情。这是完整的堆栈跟踪。在原来的帖子里
Error: [remote_transport_exception] [Agon][127.0.0.1:9300][indices:data/write/update[s]]
    at respond (/home/natealcedo/Projects/digitalfolks.hooq/node_modules/elasticsearch/src/lib/transport.js:289:15)
    at checkRespForFailure (/home/natealcedo/Projects/digitalfolks.hooq/node_modules/elasticsearch/src/lib/transport.js:248:7)
    at HttpConnector.<anonymous> (/home/natealcedo/Projects/digitalfolks.hooq/node_modules/elasticsearch/src/lib/connectors/http.js:164:7)
    at IncomingMessage.wrapper (/home/natealcedo/Projects/digitalfolks.hooq/node_modules/lodash/lodash.js:4968:19)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:186:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickDomainCallback (internal/process/next_tick.js:122:9)
titlesController.updateDocByID = function(req,res){
  const titleID = req.params.titleID;
  const partialFields = req.body;
  // TODO do some validations on the received fields
  es.update({
    index: "titles",
    type: "title",
    id: titleID,
    body: {
      doc: partialFields
    }}).then(results => {
      logger.info(results);
      res.status(200).json({
        message: "OK"
      });
    }).catch(err => {
      logger.error(err);
      res.status(500).json({
        error: "Internal server error"
      });
    });
};
titlesController.updateDocByID = function(req,res){
  const titleID = req.params.titleID;
  const partialFields = req.body;
  // TODO do some validations on the received fields
  es.update({
    index: "titles",
    type: "title",
    id: titleID,
    body: {
      script: "if (!ctx._source.isDeleted) { ctx._source.putAll(params.partialFields) }",
      params: {partialFields: partialFields}
    }}).then(results => {
      logger.info(results);
      res.status(200).json({
        message: "OK"
      });
    }).catch(err => {
      logger.error(err);
      res.status(500).json({
        error: "Internal server error"
      });
    });
};