নোডজেএস-এ মঙ্গো ডাটাবেসে সন্নিবেশ করা নথির _আইডি পান


101

আমি মঙ্গোডিবিতে নথি সন্নিবেশ করতে নোডজেএস ব্যবহার করি। ব্যবহার করে collection.insertআমি এই কোডের মতো ডাটাবেসে একটি নথি সন্নিবেশ করতে পারি:

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

_idSertedোকানো অবজেক্টটি আমি কীভাবে পেতে পারি ?

_idসর্বশেষ অবজেক্টটি withoutোকানো না পেয়ে পাওয়ার কী কোনও উপায় আছে _id?

মনে করুন যে একই সময়ে প্রচুর লোক ডাটাবেস অ্যাক্সেস করে, আমি নিশ্চিত হতে পারি না যে সর্বশেষতম আইডি objectোকানো আইডি।

উত্তর:


88

কলব্যাকের জন্য একটি দ্বিতীয় প্যারামিটার রয়েছে যার জন্য collection.insertডক বা ডক্স সন্নিবেশিত করবে, যাতে _ID থাকতে হবে।

চেষ্টা করুন:

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

এবং আমি কী বলতে চাইছি তা দেখতে কনসোলটি পরীক্ষা করুন।


4
কলব্যাক আসলে সন্নিবেশ করা নথিগুলির অ্যারে ফিরিয়ে দেয়। সুতরাং, যদি আপনি একটি একক দস্তাবেজ সন্নিবেশ করিয়ে থাকেন তবে আপনি নীচের মতো সন্নিবেশিত রেকর্ডটি অ্যাক্সেস করতে পারেন। সংগ্রহে। রেফ: মোংডোড.বিথিউথ.আইও
রোহিত সিং সেঙ্গার


লিঙ্কটি কোথাও দরকারী হতে পারে না
দবিধাদস

আমি জানি না এটি সাধারণ বা কেবলমাত্র উল্কাপথে কাজ করে, তবে আপনি যখন ক্যালেকশন.িনেট (আইটেম) কল করেন, এটি সরাসরি sertedোকানো বস্তুর আইডি ফিরিয়ে দেয়।
ভ্যান্টসেলার

4
ডক্সসাইন্টার্ড আমার জন্য একটি _id ফিরিয়ে দেয় না। এটি আমার জন্য ফিরে আসে {"ঠিক আছে": 1, "এন": 1, "ওপটাইম": {"টিএস": "6361004504208375809", "টি": 5}, "ইলেকশনআইডি": "7fffffff0000000000000005"}
user1709076

91

কলব্যাকের জন্য দ্বিতীয় প্যারামিটার ব্যবহার করার চেয়ে একটি ছোট্ট উপায়টি collection.insertএটি ব্যবহার objectToInsert._idকরবে _id(কলব্যাক ফাংশনের অভ্যন্তরে, এটি সফল অপারেশন বলে মনে করে) returns

নোডজেএস-এর জন্য মঙ্গো ড্রাইভার _idক্ষেত্রটি মূল অবজেক্টের রেফারেন্সে সংযোজন করে , তাই মূল অবজেক্টটি ব্যবহার করে sertedোকানো আইডি পাওয়া সহজ:

collection.insert(objectToInsert, function(err){
   if (err) return;
   // Object inserted successfully.
   var objectId = objectToInsert._id; // this will return the id of object inserted
});

4
খুব অন্তর্দৃষ্টিপূর্ণ আপনাকে ধন্যবাদ। কলব্যাক প্যারামিটার পরিবর্তন হওয়ার পরে অন্য কোথাও এই তথ্য খুঁজে পাওয়া যায়নি।
ব্র্যাড হেইন

@ ব্র্যাডহেইন আপনাকে স্বাগতম! সম্ভবত মোংগোডিবি ড্রাইভার অবজেক্টের রেফারেন্সটি সংশোধন করে, তাই এটি এখানেও সংশোধিত হয়। :)
আয়নিক বিজাউ

আপনার কোডটি ভুল, যেখানে আপনি var অবজেক্টআইডি = অবজেক্টটোইনসেট._আইডি বলছেন; আপনি বোঝাতে চেয়েছিলেন var অবজেক্টআইডি = অবজেক্টইনটেড._আইডি;
অ্যান্ডি লরেঞ্জ

4
@AndyLorenz কি objectInserted? আমি অনুমান করি আপনি এই উত্তরটির সঠিক বিন্দুটি অনুপস্থিত: মঙ্গো ড্রাইভারটি _idআসল বস্তুকে ক্ষেত্রটি যুক্ত করেছে। আমি উত্তরটি objectToInsertসর্বত্র ব্যবহার করার জন্য সম্পাদনা করেছি । আশা করি বিষয়গুলি এখন আরও পরিষ্কার হয়ে গেছে। :)
আয়নিক বিজাউ

4
দ্রষ্টব্য: insert()হ্রাস করা হয়েছে। insertOne()পরিবর্তে ব্যবহার করুন
অশুভ রিকো

16

যেমন কেত্রিয়াক বলেছেন, saidোকানো নথির আইডি পাওয়ার সবচেয়ে ভাল উপায় হল রেজাল্ট অবজেক্টে sertedোকানো আইডি সম্পত্তি ব্যবহার করা। আমার ক্ষেত্রে ফলাফল ._এটি কাজ করে না তাই আমাকে নিম্নলিখিতগুলি ব্যবহার করতে হয়েছিল:

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

আপনি যদি কলব্যাক ব্যবহার করেন তবে এটি একই জিনিস।


13

আমি actuallyোকানোর জন্য কলব্যাক ফাংশনে দ্বিতীয় প্যারামিটারের জন্য একটি কনসোল.লগ () করেছি। Actuallyোকানো বস্তুটি বাদ দিয়ে আসলে প্রচুর তথ্য ফিরে আসে। সুতরাং নীচের কোডটি ব্যাখ্যা করে যে আপনি কীভাবে এটির আইডি ব্যবহার করতে পারবেন।

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()
ফাদওয়া

7

মঙ্গো সম্পূর্ণ ডকুমেন্টকে কলব্যাকবজেক্ট হিসাবে প্রেরণ করে যাতে আপনি কেবল সেখান থেকে এটি পেতে পারেন।

উদাহরণ স্বরূপ

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

4

এখন আপনি insertOne পদ্ধতি এবং প্রতিশ্রুতিতে ফলাফল. insertId ব্যবহার করতে পারেন


আপনি একটি কোড উদাহরণ প্রদান করতে পারেন? এই ফলাফল অবজেক্টটি কোথা থেকে আসে?
JSideris

@ জেসিরিস, যেমন আপনি স্পেসিফিকেশন পদ্ধতি ইনসার্টওনে () দেখতে পারেন এই পদ্ধতিটি তিনটি পরামিতি গ্রহণ করে (doc, options, callback)। তৃতীয় প্যারামিটার - একটি কলব্যাক, যা দুটি পরামিতি নেয় (error, result) । এবং result- এটিই আপনি খুঁজছেন।
ktretyak

2

@ জেসিরিস, Iোকানো আইডির জন্য নমুনা কোড।

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

2

আপনি যদি "_id" নিতে চান সিম্পলি ব্যবহার করুন

result.insertedId.toString() 

// টু স্ট্রিং হেক্স থেকে রূপান্তরিত হবে


এটাই আমি খুঁজছিলাম ধন্যবাদ.
ফাদওয়া

হ্যাঁ, অন্য সংস্করণগুলির মধ্যে উল্লেখ result.insertedIdকরা হয়নি যেহেতু অন্য সংস্করণগুলি একটি ObjectIDধরণের অবজেক্ট mention .toString()এই বস্তুটিকে সত্যিকারের ইউইউডি তে রূপান্তর করবে।
ডিলান পিয়ার্স

0

ডেটা অবজেক্টটি ম্যানিপুলেট না করে আপনি _id ফিল্ডটি স্বয়ংক্রিয়ভাবে পেতে async ফাংশনগুলি ব্যবহার করতে পারেন :

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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.