NodeJS में Mongo डेटाबेस में सम्मिलित दस्तावेज़ का _id प्राप्त करें


100

मैं MongoDB में दस्तावेज़ सम्मिलित करने के लिए NodeJS का उपयोग करता हूं। का उपयोग करते हुए collection.insertमैं इस कोड में की तरह डेटाबेस में एक दस्तावेज़ सम्मिलित कर सकते हैं:

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

मुझे _idसम्मिलित वस्तु कैसे मिल सकती है ?

क्या _idबिना लेटेस्ट ऑब्जेक्ट को डाले बिना पाने का कोई तरीका है _id?

यह मानते हुए कि एक ही समय में बहुत सारे लोग डेटाबेस तक पहुँचते हैं, मुझे यकीन नहीं हो रहा है कि नवीनतम आईडी ऑब्जेक्ट की आईडी है।

जवाबों:


88

कॉलबैक के लिए एक दूसरा पैरामीटर है collection.insertकि इसमें डॉक्स या डॉक्स डाले जाएंगे, जिसमें _ids होना चाहिए।

प्रयत्न:

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

और मेरा क्या मतलब है यह देखने के लिए कंसोल की जाँच करें।


4
कॉलबैक वास्तव में डाले गए दस्तावेजों की सरणी देता है। इसलिए, यदि आपने एक भी दस्तावेज़ डाला है, तो आप नीचे दिए गए रिकॉर्ड को एक्सेस कर सकते हैं। collection.insert ({name: "David", शीर्षक: "About MongoDB"}, फ़ंक्शन (ग़लती, रिकॉर्ड) {कंसोल.लॉग ("रिकॉर्ड के रूप में जोड़ा गया" + रिकॉर्ड [0]। आईडी);}); Ref: mongodb.github.io/node-mongodb-native/markdown-docs/insert.html
रोहित सिंह सेंगर

2
कॉलबैक एपीआई बदल गया है: mongodb.github.io/node-mongodb-native/2.0/api/…
'13

लिंक कहीं भी उपयोगी नहीं है
davidhadas

मुझे नहीं पता कि यह सामान्य है या केवल उल्का में काम करता है, लेकिन जब आप collection.insert (ऑब्जेक्ट) को कॉल करते हैं, तो यह सम्मिलित ऑब्जेक्ट की आईडी को तुरंत लौटा देता है।
vantesllar

4
docsInserted मेरे लिए _id नहीं लौटाता है। यह मेरे लिए लौटता है {"ok": 1, "n": 1, "opTime": {"ts": "6361004504208375809", "t": 5}, "ElectId": "7ffffff0000000000000005"}
user1709076

90

कॉलबैक के लिए दूसरे पैरामीटर का उपयोग करने की तुलना में एक छोटा तरीका उस रिटर्न collection.insertका उपयोग करना होगा (कॉलबैक फ़ंक्शन के अंदर, यह मानते हुए कि यह एक सफल ऑपरेशन था)।objectToInsert._id_id

NodeJS के लिए मैंगो ड्राइवर _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हर जगह उपयोग करने का उत्तर संपादित किया । आशा है कि अब चीजें स्पष्ट हो जाएंगी। :)
Ionică Bizău

1
नोट: insert()पदावनत है। insertOne()इसके बजाय का उपयोग करें
badReiko

16

जैसा कि ktretyak ने कहा, सम्मिलित दस्तावेज़ की ID प्राप्त करने का सबसे अच्छा तरीका यह है कि परिणाम ऑब्जेक्ट पर सम्मिलित संपत्ति का उपयोग करें। मेरे मामले में result._id ने काम नहीं किया इसलिए मुझे निम्नलिखित का उपयोग करना पड़ा:

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

यदि आप कॉलबैक का उपयोग करते हैं तो यह एक ही बात है।


13

मैंने वास्तव में सम्मिलित करने के लिए कॉलबैक फ़ंक्शन में दूसरे पैरामीटर के लिए एक कंसोल .log () किया था। वहाँ वास्तव में डाली गई वस्तु से अलग लौटाई गई जानकारी है। तो नीचे दिए गए कोड में बताया गया है कि आप इसे कैसे एक्सेस कर सकते हैं

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)}। डेटाबेस में मौजूद वास्तविक आईडी प्राप्त करने के लिए मैं इसका उपयोग कैसे कर सकता हूं? ... एक अन्य टिप्पणी में उत्तर मिला: उपयोग करेंresult.insertedId.toString()
Fadwa

7

Mongo एक पूर्ण कॉलबैक के रूप में पूरा दस्तावेज भेजता है ताकि आप इसे केवल वहां से प्राप्त कर सकें।

उदाहरण के लिए

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

4

अब आप InsertOne मेथड और वादे के result.insertedId में उपयोग कर सकते हैं


क्या आप एक कोड उदाहरण प्रदान कर सकते हैं? यह परिणाम वस्तु कहां से आती है?
JSideris

@JSideris, जैसा कि आप विनिर्देश विधि में देख सकते हैं InsertOne () , यह विधि तीन मापदंडों को स्वीकार करती है (doc, options, callback)। तीसरा पैरामीटर - एक कॉलबैक, जो दो पैरामीटर लेता है (error, result) । और result- यह वही है जो आप ढूंढ रहे हैं।
ktretyak

2

@JSideris, InsertId के लिए नमूना कोड।

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

2

अगर आप "_id" का उपयोग करना चाहते हैं

result.insertedId.toString() 

//String हेक्स से परिवर्तित हो जाएगा


यही मैं ढूंढ रहा था। धन्यवाद।
फडवा

हाँ, वहाँ एक संस्करण परिवर्तन होना चाहिए क्योंकि अन्य उत्तरों का उल्लेख नहीं result.insertedIdहै एक ObjectIDप्रकार की वस्तु है। .toString()इस ऑब्जेक्ट को वास्तविक UUID में बदल देगा।
डायलन पियर्स

0

आप डेटा ऑब्जेक्ट में हेरफेर किए बिना स्वचालित रूप से _id फ़ील्ड प्राप्त करने के लिए async फ़ंक्शंस का उपयोग कर सकते हैं :

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

  await db.collection('users', data )

  return data
}

डेटा लौटाता है:

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

0

इसे async फ़ंक्शन में करने का दूसरा तरीका:

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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.