获取 NodeJS 中 Mongo 数据库中插入文档的_id

我使用 NodeJS 在 MongoDB 中插入文档。使用 collection.insert,我可以像下面这段代码一样将文档插入数据库:

// ...
collection.insert(objectToInsert, function(err){
if (err) return;
// Object inserted successfully.
var objectId; // = ???
});
// ...

如何得到插入对象的 _id

有什么办法可以得到的 _id没有得到最新的对象插入 _id

Supposing that in same time a lot of people access the database, I can't be sure that the latest id is the id of object inserted.

133396 次浏览

对于 collection.insert的回调,还有第二个参数,它将返回插入的 doc 或 docs,它应该具有 _ ids。

试试:

collection.insert(objectToInsert, function(err,docsInserted){
console.log(docsInserted);
});

检查控制台,看看我的意思。

与使用第二个参数进行 collection.insert的回调相比,使用返回 _idobjectToInsert._id(在回调函数内部,假设它是一个成功的操作)是一种更短的方法。

NodeJS 的 Mongo 驱动程序将 _id字段附加到原始对象引用,因此使用原始对象很容易获得插入的 id:

collection.insert(objectToInsert, function(err){
if (err) return;
// Object inserted successfully.
var objectId = objectToInsert._id; // this will return the id of object inserted
});

Mongo 将完整的文档作为 callbackobject 发送,因此您只需从那里获取它。

比如说

collection.save(function(err,room){
var newRoomId = room._id;
});

实际上,我为插入的回调函数中的第二个参数做了 console.log ()。实际上,除了插入的对象本身之外,还返回了许多信息。因此下面的代码解释了如何访问它的 id。

collection.insert(objToInsert, function (err, result){
if(err)console.log(err);
else {
console.log(result["ops"][0]["_id"]);
// The above statement will output the id of the
// inserted object
}
});

现在,您可以使用 插入一方法,并且可以使用晃动的 result

As ktretyak said, to get inserted document's ID best way is to use insertedId property on result object. In my case result._id didn't work so I had to use following:

db.collection("collection-name")
.insertOne(document)
.then(result => {
console.log(result.insertedId);
})
.catch(err => {
// handle error
});

如果你使用回调也是一样的。

@ JSideris,插入 Id 的示例代码。

db.collection(COLLECTION).insertOne(data, (err, result) => {
if (err)
return err;
else
return result.insertedId;
});

如果要使用“ _ id”,请使用 simpley

result.insertedId.toString()

//toString 将从十六进制转换

You could use 异步函数 to get _id field automatically without manipulating data object:

async function save() {
const data = {
name: "John"
}


await db.collection('users').insertOne(data)


return data
}

Returns (data object):

{
_ id:’5dbff150b407cc129ab571ca’,
姓名: 约翰,
}

在异步函数中的另一种方法是:

const express = require('express')
const path = require('path')
const db = require(path.join(__dirname, '../database/config')).db;
const router = express.Router()


// Create.R.U.D
router.post('/new-order', async function (req, res, next) {


// security check
if (Object.keys(req.body).length === 0) {
res.status(404).send({
msg: "Error",
code: 404
});
return;
}


try {


// operations
let orderNumber = await db.collection('orders').countDocuments()
let number = orderNumber + 1
let order = {
number: number,
customer: req.body.customer,
products: req.body.products,
totalProducts: req.body.totalProducts,
totalCost: req.body.totalCost,
type: req.body.type,
time: req.body.time,
date: req.body.date,
timeStamp: Date.now(),


}


if (req.body.direction) {
order.direction = req.body.direction
}


if (req.body.specialRequests) {
order.specialRequests = req.body.specialRequests
}


// Here newOrder will store some informations in result of this process.
// You can find the inserted id and some informations there too.
        

let newOrder = await db.collection('orders').insertOne({...order})


if (newOrder) {


// MARK: Server response
res.status(201).send({
msg: `Order N°${number} created : id[${newOrder.insertedId}]`,
code: 201
});


} else {


// MARK: Server response
res.status(404).send({
msg: `Order N°${number} not created`,
code: 404
});


}


} catch (e) {
print(e)
return
}


})


// C.Read.U.D




// C.R.Update.D




// C.R.U.Delete






module.exports = router;

与其他响应类似,您可以使用异步等待 es6 + 特性获取变量。

const insertData = async (data) => {


const { ops } = await db.collection('collection').insertOne(data)
console.log(ops[0]._id)
  

}