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

时间:2013-01-23 13:59:09

标签: javascript node.js mongodb

我使用NodeJS在MongoDB中插入文档。使用collection.insert我可以将文档插入到数据库中,如下代码所示:

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

如何获取插入对象的_id

有没有办法在没有插入最新对象_id的情况下获取_id

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

11 个答案:

答案 0 :(得分:80)

collection.insert的回调还有第二个参数,它会返回插入的文档或文档,应该有_ids。

尝试:

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

并检查控制台以查看我的意思。

答案 1 :(得分:80)

比使用collection.insert回调的第二个参数更短的方法是使用返回objectToInsert._id的{​​{1}}(在回调函数内部,假设它是一个成功的操作)。

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

_id

答案 2 :(得分:12)

正如ktretyak所说,获取插入文档的ID最好的方法是在结果对象上使用insertedId属性。在我的情况下,result._id没有工作,所以我不得不使用以下内容:

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

如果使用回调,情况也是一样的。

答案 3 :(得分:11)

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

答案 4 :(得分:6)

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

例如

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

答案 5 :(得分:4)

现在你可以使用insertOne方法和promise的result.insertedId

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

if you want to take "_id" use simpley

result.insertedId.toString() 

// toString will convert from hex

答案 8 :(得分:0)

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

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

  await db.collection('users', data )

  return data
}

返回数据:

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

答案 9 :(得分: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;

答案 10 :(得分:0)

与其他响应类似,您可以使用 async await、es6+ 功能获取变量。

const insertData = async (data) => {

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