【问题标题】:Get the _id of inserted document in Mongo database in NodeJS在NodeJS中获取Mongo数据库中插入文档的_id
【发布时间】:2013-01-23 13:59:08
【问题描述】:

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

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

如何获取插入对象的_id

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

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

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    比使用第二个参数回调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
    });
    

    【讨论】:

    • 非常有见地,谢谢。由于回调参数的变化,无法在其他任何地方找到此信息。
    • @BradHein 不客气!可能是 MongoDB 驱动程序修改了对象引用,所以这里也进行了修改。 :)
    • 你的代码错了,你说 var objectId = objectToInsert._id;你的意思是说 var objectId = objectInserted._id;
    • @AndyLorenz objectInserted 是什么?我猜你错过了这个答案的重点:Mongo 驱动程序将 _id 字段附加到原始对象。我编辑了答案以在任何地方使用objectToInsert。希望现在事情更清楚了。 :)
    • 注意:insert() 已弃用。请改用insertOne()
    【解决方案2】:

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

    试试:

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

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

    【讨论】:

    • 回调实际上返回插入的文档数组。因此,如果您插入了一个文档,那么您可以访问插入的记录,如下所示。 collection.insert({name:"David", title:"关于 MongoDB"}, function(err, records){ console.log("Record added as "+records[0]._id); });参考:mongodb.github.io/node-mongodb-native/markdown-docs/insert.html
    • 链接没有指向任何有用的地方
    • 我不知道这是通用的还是只在meteor中起作用,但是当你调用collection.insert(object)时,它会立即返回插入对象的id。
    • docsInserted 不会为我返回 _id。它为我返回 { "ok": 1, "n": 1, "opTime": { "ts": "6361004504208375809", "t": 5 }, "electionId": "7fffffff0000000000000005" }
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我实际上为插入回调函数中的第二个参数做了一个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()
      【解决方案5】:

      如果你想使用“_id”,请使用简单

      result.insertedId.toString() 
      

      // toString 将从十六进制转换

      【讨论】:

      • 这就是我想要的。谢谢。
      • 是的,必须有版本更改,因为其他答案没有提到 result.insertedIdObjectID 类型对象。 .toString() 会将此对象转换为真正的 UUID。
      【解决方案6】:

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

      例如

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 您能提供一个代码示例吗?这个结果对象来自哪里?
        • @JSideris,在规范方法insertOne()中可以看到,该方法接受三个参数(doc, options, callback)。第三个参数 - 一个回调,which takes two parameters(error, result)。还有result - 这就是你要找的东西。
        【解决方案8】:

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

        async function save() {
          const data = {
            name: "John"
          }
        
          await db.collection('users').insertOne(data)
        
          return data
        }
        

        返回数据:

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

        【讨论】:

        • 不使用回调的最佳答案!谢谢!
        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

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

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

          【讨论】:

            【解决方案11】:

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

            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;
            

            【讨论】:

              猜你喜欢
              • 2015-09-17
              • 2014-09-08
              • 1970-01-01
              • 2020-12-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多