111

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

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

我怎样才能得到_id插入的对象?

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

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

4

11 回答 11

95

比使用第二个参数进行回调更短的方法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
});
于 2013-01-23T14:29:18.627 回答
90

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

尝试:

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

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

于 2013-01-23T14:13:26.930 回答
21

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

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

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

于 2017-02-24T21:45:58.510 回答
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
       }
});
于 2015-06-19T00:19:04.713 回答
8

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

result.insertedId.toString() 

// toString 将从十六进制转换

于 2019-01-15T18:27:36.223 回答
7

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

例如

collection.save(function(err,room){
  var newRoomId = room._id;
  });
于 2014-09-02T05:25:01.933 回答
7

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

于 2016-07-28T08:34:22.877 回答
5

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

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

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

  return data
}

返回数据:

{
  _id: '5dbff150b407cc129ab571ca',
  name: 'John'
}
于 2019-11-04T09:45:29.377 回答
2

@JSideris,获取insertedId 的示例代码。

db.collection(COLLECTION).insertOne(data, (err, result) => {
    if (err) 
      return err;
    else 
      return result.insertedId;
  });
于 2018-11-16T08:05:44.137 回答
1

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

const insertData = async (data) => {

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

于 2021-03-03T18:01:25.623 回答
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;
于 2020-06-22T14:18:58.560 回答