Node.js 如何动态更新文档的字段?
我正在构建一个用于存储电影/电视标题的基本crud应用程序。我正在使用elasticsearch的2.4.4版,因为我的项目经理选择了这个版本。我正在使用express框架和本机elasticsearch nodejs驱动程序 目前,对于“title”类型的“titles”索引,这就是我的映射 我希望在我的服务器上有一个端点,可以通过其id更新文档。这是我迄今为止为该端点“POST/api/titles/:titleID/updateTitleByID”所做的 我想要实现的是用我从req.body中得到的内容更新文档。例如,如果我从请求主体中获得一个seriesName I。这只是我想要更新的内容,其余的都保持不变。我如何做到这一点 编辑:这是完整的堆栈跟踪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
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
配置文件中输入。非常感谢!:)你能告诉我脚本编写的方向吗?我不知道有一个方法。putallctx。_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"
});
});
};