Node.js使用MongoDB 4.0时insertOne返回的result.ops为undefined如何解决
问题原因
Node.js MongoDB 4.x版本驱动对insertOne操作的返回结果结构做了破坏性调整,3.x版本中用于返回插入文档数组的ops属性已被官方移除,因此调用result.ops会返回undefined。
解决方案
你可以通过两种方式获取到插入的完整文档:
- 方案一:直接拼接插入数据和返回的
insertedId,无需额外查询,性能最优 - 方案二:通过返回的
insertedId执行查询,获取数据库中实际存储的文档内容
方案一代码示例
const mongodb = require('mongodb'); const MongoClient = mongodb.MongoClient // 注意原代码中此处变量名存在拼写错误,已修正 const connectionURL = 'mongodb://127.0.0.1:27017' const databaseName = 'task-manager' MongoClient.connect(connectionURL, { useNewUrlParser: true }, (error, client) => { if(error){ return console.log('Unable to connect to database!') } const db = client.db(databaseName) // 提前定义要插入的文档 const userDoc = { name: 'vano', age: 12 } db.collection('users').insertOne(userDoc, (error, result) => { if(error){ return console.log('Unable to insert user!') } // 拼接_id得到完整的插入文档 const insertedDoc = { ...userDoc, _id: result.insertedId } console.log(insertedDoc) // 操作完成后关闭连接 client.close() }) })
方案二代码示例
如果需要确认数据库实际存储的数据,可使用查询方式:
const mongodb = require('mongodb'); const MongoClient = mongodb.MongoClient const connectionURL = 'mongodb://127.0.0.1:27017' const databaseName = 'task-manager' MongoClient.connect(connectionURL, { useNewUrlParser: true }, async (error, client) => { if(error){ return console.log('Unable to connect to database!') } const db = client.db(databaseName) db.collection('users').insertOne({ name: 'vano', age: 12 }, async (error, result) => { if(error){ return console.log('Unable to insert user!') } // 根据返回的插入id查询完整文档 const insertedDoc = await db.collection('users').findOne({ _id: result.insertedId }) console.log(insertedDoc) client.close() }) })
提示:如果不需要严格校验数据库写入结果,优先使用方案一即可满足需求
内容的提问来源于stack exchange,提问作者luka
相关产品推荐
相关产品推荐

