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


100

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

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

如何获取_id插入的对象?

有什么方法可以在_id不插入最新对象的情况下获得_id

假设同时有很多人访问数据库,我不确定最新的id是插入的对象的id。

Answers:


88

回调的第二个参数collection.insert将返回插入的一个或多个doc,其中应包含_ids。

尝试:

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

并查看控制台,了解我的意思。


4
回调实际上返回插入的文档数组。因此,如果您插入了单个文档,则可以按以下方式访问插入的记录。collection.insert({name:“ David”,title:“关于MongoDB”},函数(错误,记录){console.log(“记录添加为” + records [0] ._ id);}); 参考:mongodb.github.io/node-mongodb-native/markdown-docs/insert.html
Rohit Singh Sengar


链接不会导致有用的任何地方
davidhadas 16-4-8

我不知道这是通用的还是仅适用于流星,但是当您调用collection.insert(object)时,它立即返回插入对象的ID。
vantesllar '16

4
docsInserted不会为我返回_id。它为我返回{“ ok”:1,“ n”:1,“ opTime”:{“ ts”:“ 6361004504208375809”,“ t”:5},“ electionId”:“ 7fffffff0000000000000005”}
user1709076

90

比使用第二个参数进行回调的方法更短的方法collection.insert是使用objectToInsert._id返回_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
});

4
非常有见地的谢谢。自从回调参数更改以来,在其他任何地方都找不到此信息。
布莱德·海因

@BradHein不客气!MongoDB驱动程序可能会修改对象引用,因此在此也会对其进行修改。:)
尼卡比曹

您的代码是错误的,在这里您说var objectId = objectToInsert._id; 您的意思是说var objectId = objectInserted._id;
安迪·洛伦兹

3
@AndyLorenz是什么objectInserted?我想您恰好错过了此答案的重点:Mongo驱动程序将_id字段追加到原始对象。我编辑了答案以objectToInsert在任何地方使用。希望现在情况已经清楚了。:)
尼卡比曹

1
注意:insert()已弃用。请insertOne()改用
evilReiko

16

正如ktretyak所说,获得插入文档ID的最佳方法是在结果对象上使用insertedId属性。就我而言,result._id无效,因此我必须使用以下命令:

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

如果您使用回调,那也是一样。


13

我实际上为插入的回调函数中的第二个参数做了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
       }
});

这将输出一个ObjectID {_bsontype: "ObjectID", id: Buffer(12)}。我如何使用它来获取数据库中的实际ID?...在​​另一条评论中找到了答案:使用result.insertedId.toString()
Fadwa

7

Mongo将完整的文档作为回调对象发送,因此您仅可以从那里获取它。

例如

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


2

@JSideris,用于获取insertId的示例代码。

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

2

如果您想使用“ _id”,请使用simpley

result.insertedId.toString() 

// toString将从十六进制转换


那就是我想要的。谢谢。
Fadwa

是的,一定有一个版本的变化,因为其他的答案不提result.insertedId是一个ObjectID类型的对象。.toString()会将这个物件转换成真实的UUID。
迪伦·皮尔斯

0

您可以使用异步函数自动获取_id字段,而无需处理数据对象:

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

  await db.collection('users', data )

  return data
}

返回数据:

{
  _id: '5dbff150b407cc129ab571ca',
  name: 'John'
}

0

在异步功能中执行此操作的另一种方法:

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.