使用Node.js将MongoDB数据导入ElasticSearch时遇_id字段解析错误
问题分析与解决
错误原因很明确:ElasticSearch的_id是元数据字段,不能放在文档内容中,必须通过API请求参数指定。你虽然在bulk的index指令里指定了_id,但同时把MongoDB返回的完整文档(自带_id字段)也传入了ES,ES会尝试解析文档内的_id字段,从而触发冲突报错。
修正后的代码
处理每个MongoDB文档时,移除其中的_id字段,再将清理后的文档传给ES:
db.collection("article_beta") .find() .limit(100) .toArray((err, docs) => { if (err) throw err; esClient.bulk( { body: docs.flatMap((doc) => { // 移除文档自带的_id字段 const { _id, ...docWithoutId } = doc; return [ { index: { _index: "impact-fulltext", _id: _id.$oid, }, }, docWithoutId, ]; }), }, (err, resp) => { if (err) throw err; console.log(resp); client.close(); } ); });
补充说明
- 用ES6解构赋值
{ _id, ...docWithoutId }可以快速剥离文档中的_id字段,得到仅包含业务数据的对象。 - 始终保证ES文档的
_id只通过bulk指令的index参数指定,文档内容中不要包含该元数据字段。
内容的提问来源于stack exchange,提问作者Kunal Pandey
相关产品推荐
相关产品推荐

