মংগোক্লিয়েন্ট v3.0 ব্যবহার করার সময় db.collection কোনও ফাংশন নয়


132

আমি মঙ্গোডিবি সহ নোডজেএস-এ ডাব্লু 3 স্কুল স্কুল টিউটোরিয়াল চেষ্টা করছি ।

যখন আমি এই উদাহরণটি নোডজেএস এনভায়রনমেন্টে বাস্তবায়নের চেষ্টা করি এবং AJAX কল দিয়ে ফাংশনটি প্রার্থনা করি, আমি নীচের ত্রুটি পেয়েছি:

TypeError: db.collection is not a function
    at c:\Users\user\Desktop\Web Project\WebService.JS:79:14
    at args.push (c:\Users\user\node_modules\mongodb\lib\utils.js:431:72)
    at c:\Users\user\node_modules\mongodb\lib\mongo_client.js:254:5
    at connectCallback (c:\Users\user\node_modules\mongodb\lib\mongo_client.js:933:5)
    at c:\Users\user\node_modules\mongodb\lib\mongo_client.js:794:11
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)

আমার প্রয়োগকৃত কোডের নীচে সন্ধান করুন:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mytestingdb";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  db.collection("customers").findOne({}, function(err, result) {
    if (err) throw err;
    console.log(result.name);
    db.close();
  });
});

নোট করুন যে যখনই মৃত্যুদণ্ড কার্যকর হয় ত্রুটি ঘটে:

db.collection("customers").findOne({}, function(err, result) {}

এছাড়াও, নোট করুন (এটি বিবেচনার ক্ষেত্রে) আমি নোড জেএস ( এনপিএম ইনস্টল মঙ্গোডব ) এর জন্য সর্বশেষতম মঙ্গোডিবি প্যাকেজটি ইনস্টল করেছি এবং মঙ্গোডিবি সংস্করণটি মঙ্গোডিবি এন্টারপ্রাইজ 3.4.4, মোংগোডিবি নোড.জেএস ড্রাইভার v3.0.0-rc0 সহ।


আপনি কি নিশ্চিত করেছেন: (1) ডাটাবেস চলছে (প্রদত্ত কোনও ত্রুটি ছিল না, আমি অনুমান করি); (২) ডাটাবেস মাইস্টেস্টিংডিবি বিদ্যমান (আপনার সংযোগ অ্যাক্সেস করতে এবং সংগ্রহগুলি দেখতে রোবঙ্গোঙ্গো / রোবো 3 টি ব্যবহার করে চেষ্টা করুন) (3) সংগ্রহের গ্রাহকরা আসলে উপস্থিত; এছাড়াও আপনি কীভাবে সেই স্ক্রিপ্টটি কল করছেন এবং নোডেজের কোনও সংস্করণ (আপনি কীভাবে ইনস্টল করলেন?)
nbkhope

ডাটাবেস এবং সংগ্রহ বিদ্যমান (আমি তাদের স্টুডিও 3 টি ব্যবহার করে অ্যাক্সেস করেছি)। আমি এজেএক্স কলের মাধ্যমে পদ্ধতিটি কল করে নোডজেএস ডিবাগ করছি, মূলত ব্রেকপয়েন্টগুলি হিট হচ্ছে এবং উপরে বর্ণিত ব্যতিক্রম না পাওয়া পর্যন্ত সবকিছু ঠিকঠাক কাজ করে। নোডজেএস সংস্করণটি v6.11.4
এলি আসমার

তারপরে db.collection()...কোনও কনসোল লগ দিয়ে শুরু হওয়া কোডটি প্রতিস্থাপন করুন এটি দেখার জন্য এটি কোনও সমস্যা নেই কিনা।
এনবিখোপ

ডাটাবেস এবং সংগ্রহ বিদ্যমান (আমি তাদের স্টুডিও 3 টি ব্যবহার করে অ্যাক্সেস করেছি)। আমি এজেএক্স কলের মাধ্যমে পদ্ধতিটি কল করে নোডজেএস ডিবাগ করছি, মূলত ব্রেকপয়েন্টগুলি হিট হচ্ছে এবং উপরে বর্ণিত ব্যতিক্রম না পাওয়া পর্যন্ত সবকিছু ঠিকঠাক কাজ করে। নোডজেএস সংস্করণটি v6.11.4
এলি Asmar

উত্তর:


80

আমি একই জিনিস সম্মুখীন। প্যাকেজ.জেসনে, মঙ্গোদব লাইনটি "মঙ্গোদব" এ পরিবর্তন করুন: "^ 2.2.33"। আপনাকে মংডোব আনইনস্টল করতে হবে এনপিএম; তারপরে এই সংস্করণটি ইনস্টল করতে এনপিএম ইনস্টল করুন।

এটি আমার জন্য সমস্যাটি সমাধান করেছে। ত্রুটি বলে মনে হচ্ছে বা ডক্স আপডেট করা দরকার।


15
মিকাএসের উত্তরটি পরীক্ষা করুন
হার্টমুট

67
পূর্ববর্তী সংস্করণে ডাউনগ্রেডিং আসলেই কোনও সমাধান নয় এটি কেবলমাত্র এটির কারণ হিসাবে আপনি যে এপিআই পরিবর্তনগুলি
ঘটাচ্ছেন

3
@ জনকুলভিনার - এটি একটি সময়ের বিষয় ছিল; কোনও অলসতার বিষয় নয় তারা যখন নতুন আপডেট প্রকাশের প্রক্রিয়া চলছিল তখন এই সমস্যাটি ঘটেছিল। আমি (এবং মূল পোস্টার) স্পষ্টতই এটি উপলব্ধি করতে পারি নি। সেই সময়, দস্তাবেজগুলি এখনও আপডেট হয়নি। সেগুলি খুব শীঘ্রই আপডেট হয়েছিল। যেহেতু এখনই এটি সমাধান করতে চাইছেন তাদের মিকাসের মন্তব্য অনুসরণ করা উচিত এবং আপডেট হওয়া ডকগুলি পর্যালোচনা করা উচিত .. ডকগুলি আপডেট হওয়ার পরে আমিও তাই করেছি এবং আপগ্রেড সংস্করণ দিয়ে চালিয়ে যেতে সক্ষম হয়েছি।
আইয়ো

1
এখনই এই বিষয়টি নিয়ে আসছি - আমি এই সমস্যাটি নিয়ে চলেছি এবং প্যাকেজ.জসনে "মংডব:" "3.0.2" ইনস্টল করা আছে, নতুন সংস্করণে কি সমস্যা আছে?
লোগো_164

4
মোটেই সাহায্য করে না। কেন এটি সঠিক উত্তর হিসাবে পতাকাঙ্কিত করা হয়?
কোডিংনো

481

মঙ্গোডিবি নেটিজেজেএস ড্রাইভারের 3.0 সংস্করণে লোকদের জন্য:

(এটি "মঙ্গোডব": "^ 3.0.0-আরসি0", বা প্যাকেজ.জসনের একটি পরবর্তী সংস্করণ, যা সর্বশেষতম সংস্করণটি ব্যবহার করে রাখতে চাইছে তাদের জন্য প্রযোজ্য))

মোংগোডিবি নেটিজেডএস ড্রাইভারের সংস্করণ ২.x সংস্করণে আপনি সংযুক্ত কলব্যাকের আর্গুমেন্ট হিসাবে ডাটাবেস অবজেক্টটি পাবেন:

MongoClient.connect('mongodb://localhost:27017/mytestingdb', (err, db) => {
  // Database returned
});

3.0.০ এর চেঞ্জলগ অনুসারে আপনি পরিবর্তে ডাটাবেস অবজেক্টযুক্ত ক্লায়েন্ট অবজেক্ট পাবেন:

MongoClient.connect('mongodb://localhost:27017', (err, client) => {
  // Client returned
  var db = client.db('mytestingdb');
});

close()পদ্ধতি এছাড়াও ক্লায়েন্ট সরানো হয়েছে। প্রশ্নের কোডটি তাই অনুবাদ করা যায়:

MongoClient.connect('mongodb://localhost', function (err, client) {
  if (err) throw err;

  var db = client.db('mytestingdb');

  db.collection('customers').findOne({}, function (findErr, result) {
    if (findErr) throw findErr;
    console.log(result.name);
    client.close();
  });
}); 

এখন আমাদের কি এই ( var db = client.db('mytestingdb');) অতিরিক্ত লাইনটি প্রতিবার কেবল এই জাতীয় ( MongoClient.connect('mongodb://localhost:27017/mytestingdb')) লেখার পরিবর্তে লিখতে হবে ? আমি সবসময় একই ডাটাবেস নিয়ে কাজ করছি। অতিরিক্ত রেখাটি দূর করার জন্য কি কোনও পন্থা রয়েছে? এটা আমার জন্য সময় সাশ্রয়ী মূল্যের মতো বিষয়।
ওজগ্রোজার

7
@ ওজগ্রোজার আমার কাছে মনে হচ্ছে আপনি প্রতিটি অনুরোধের জন্য ডিবিতে সংযোগ করছেন। এটি একটি খারাপ ধারণা হিসাবে বিবেচিত। আপনি এটি সম্পর্কে এখানে পড়তে পারেন । যদি আপনি কেবল একবার সংযুক্ত হন তবে আপনার তৈরি প্রতি অ্যাপ্লিকেশনটিতে কেবল একটি নতুন লাইন রয়েছে।
মিকা সুন্দল্যান্ড

1
@ মিকাস ওহ হ্যাঁ আপনি যেমন বলেছিলেন তেমনই আমি ডিবিতে সংযুক্ত ছিলাম। আমি জানতাম না যে আমরা একবার সংযোগ করতে পারি এবং ডিবি ভেরিয়েবলটি পুনরায় ব্যবহার করতে পারি। তোমাকে অনেক ধন্যবাদ.
ওজগ্রোজার

1
দুর্দান্ত উত্তর; এটি বের করা একটি সময় স্তন্যপান ছিল, আমার
আরটিএফএম-র

আমি ক্লায়েন্টকে এর মতো করে প্রয়োগ করেছি, তবে এখনও problems নোড_মডিউলগুলি \ মোংডব \ lib \ গ্রিডস-স্ট্রিম \ index.js: 50: 27
alex351

33

যারা সংস্করণ ^ 3.0.1 ব্যবহার চালিয়ে যেতে চান তাদের জন্য আপনি কীভাবে MongoClient.connect()পদ্ধতিটি ব্যবহার করেন তার পরিবর্তন সম্পর্কে সচেতন হন । কলব্যাকটি ফিরে আসার dbপরিবর্তে ফিরে আসে না client, যার বিপরীতে এমন একটি ফাংশন রয়েছে db(dbname)যা আপনাকে সন্ধান করা dbদৃষ্টান্তটি পেতে অনুরোধ করতে হবে ।

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'myproject';

// Use connect method to connect to the server
MongoClient.connect(url, function(err, client) {
  assert.equal(null, err);
  console.log("Connected successfully to server");

  const db = client.db(dbName);

  client.close();
});

2
এই উত্তরটি আরও সাম্প্রতিক এবং ড্রাইভারের 3 সংস্করণে প্রযোজ্য। ধন্যবাদ
মোহাম্মদ

1
আমি এই সমাধানটি প্রস্তাব দিচ্ছি, এটি ভবিষ্যতের রেফারেন্সের জন্য আরও উপযুক্ত।
জেমি নিকোল-শেলি

30
MongoClient.connect(url (err, client) => {
    if(err) throw err;

    let database = client.db('databaseName');

    database.collection('name').find()
    .toArray((err, results) => {
        if(err) throw err;

        results.forEach((value)=>{
            console.log(value.name);
        });
    })
})

আপনার কোডের সাথে একমাত্র সমস্যা হ'ল আপনি ডাটাবেস হ্যান্ডলারটি ধারণ করে থাকা অবজেক্টটি অ্যাক্সেস করছেন। আপনাকে অবশ্যই সরাসরি ডাটাবেস অ্যাক্সেস করতে হবে (উপরে ডাটাবেস ভেরিয়েবল দেখুন)। এই কোডটি আপনার ডাটাবেসটিকে একটি অ্যারেতে ফিরিয়ে দেবে এবং তারপরে এটি লুপ হয়ে যায় এবং ডাটাবেসের প্রত্যেকের জন্য নাম লগ করে।


দৈর্ঘ্য এবং সামগ্রীর কারণে এই উত্তরটি নিম্ন মানের হিসাবে চিহ্নিত হয়েছে is আরও তথ্য সরবরাহ করুন।
ওয়াহ্যু ক্রিস্টিয়ানো

এটি যতক্ষণ হওয়া দরকার ততক্ষণ। এই উত্তরটি আমাকে সাহায্য করেছিল।
ম্যানুয়েল হার্নান্দেজ

1
@ ম্যানুয়েল হার্নান্দেজ খুশি হলেন :)
ড্রে জ্যাকসন

এটি সঠিক উত্তর। দয়া করে এটিকে সঠিক উত্তর হিসাবে চিহ্নিত করুন।
নিনাদ কাম্বলি

12

পিঙ্গি মঙ্গো ক্লায়েন্ট v3.x এর জন্য @ মিক্কা উত্তর জবাবদিহি করে, আমার কেবলমাত্র অ্যাসিঙ্ক / অপেক্ষার ফর্ম্যাটটি প্রয়োজন, এটি সামান্য পরিবর্তিত দেখায়:

const myFunc = async () => {

     // Prepping here...


    // Connect
    let client = await MongoClient.connect('mongodb://localhost');
    let db = await client.db();

    // Run the query
    let cursor = await db.collection('customers').find({});

    // Do whatever you want on the result.
}

7

আমি ইউআরএলের অংশ হিসাবে ডাটাবেসের নাম রাখতে পারি কিনা তা দেখার জন্য আমি কিছুটা পরীক্ষা-নিরীক্ষা করেছিলাম। আমি প্রতিশ্রুতি বাক্য গঠনটি পছন্দ করি তবে এটি কলব্যাক সিনট্যাক্সের জন্য এখনও কাজ করা উচিত। ক্লায়েন্ট.ডিবি () এর নীচে লক্ষ্য করুন কোনও পরামিতি ছাড়াই কল করা হয়।

MongoClient.connect(
    'mongodb://localhost:27017/mytestingdb', 
    { useNewUrlParser: true}
)
.then(client => {

    // The database name is part of the url.  client.db() seems 
    // to know that and works even without a parameter that 
    // relays the db name.
    let db = client.db(); 

    console.log('the current database is: ' + db.s.databaseName);
    // client.close() if you want to

})
.catch(err => console.log(err));

আমার প্যাকেজ.জসন monbodb lists 3.2.5 তালিকাভুক্ত করে।

আপনি যদি অবমূল্যায়নের সতর্কতা মোকাবেলা করতে ইচ্ছুক হন তবে 'UseNewUllParser' বিকল্পের প্রয়োজন নেই। সংস্করণ 4 না আসা পর্যন্ত এই মুহূর্তে ব্যবহার করা বুদ্ধিমানের কাজ যেখানে সম্ভবত নতুন ড্রাইভারটি ডিফল্ট হবে এবং আপনার আর বিকল্পের প্রয়োজন হবে না।


5

আমি এই কোডগুলি চালনার মাধ্যমে এটি সহজে সমাধান করেছি:

 npm uninstall mongodb --save

 npm install mongodb@2.2.33 --save

শুভ কোডিং!


4

আমার কাছে মঙ্গোডিবি শেল সংস্করণ v3.6.4 রয়েছে, নীচে কোড ব্যবহারের জন্য মঙ্গোক্লিয়েন্ট রয়েছে, এটি আমার পক্ষে ভাল:

var MongoClient = require('mongodb').MongoClient,
assert = require('assert');
var url = 'mongodb://localhost:27017/video';
MongoClient.connect(url,{ useNewUrlParser: true }, function(err, client) 
{
assert.equal(null, err);
console.log("Successfully connected to server");
var db = client.db('video');
// Find some documents in our collection
db.collection('movies').find({}).toArray(function(err, docs) {
// Print the documents returned
docs.forEach(function(doc) {
console.log(doc.title);
});
// Close the DB
client.close();
});
// Declare success
console.log("Called find()");
 });

এই প্রশ্নটি নোড ড্রাইভারের সাথে সম্পর্কিত, শেল নয়।
ক্রিক

3

কেউ যদি এখনও এই ত্রুটিটি সমাধান করার চেষ্টা করে তবে আমি নীচের মতো এটি করেছি।

const MongoClient = require('mongodb').MongoClient;
// Connection URL
const url = 'mongodb://localhost:27017';
// Database Name
const dbName = 'mytestingdb';

const retrieveCustomers = (db, callback)=>{
    // Get the customers collection
    const collection = db.collection('customers');
    // Find some customers
    collection.find({}).toArray((err, customers) =>{
        if(err) throw err;
      console.log("Found the following records");
      console.log(customers)
      callback(customers);
    });
}

const retrieveCustomer = (db, callback)=>{
    // Get the customers collection
    const collection = db.collection('customers');
    // Find some customers
    collection.find({'name': 'mahendra'}).toArray((err, customers) =>{
        if(err) throw err;
      console.log("Found the following records");
      console.log(customers)
      callback(customers);
    });
}

const insertCustomers = (db, callback)=> {
    // Get the customers collection
    const collection = db.collection('customers');
    const dataArray = [{name : 'mahendra'}, {name :'divit'}, {name : 'aryan'} ];
    // Insert some customers
    collection.insertMany(dataArray, (err, result)=> {
        if(err) throw err;
        console.log("Inserted 3 customers into the collection");
        callback(result);
    });
}

// Use connect method to connect to the server
MongoClient.connect(url,{ useUnifiedTopology: true }, (err, client) => {
  console.log("Connected successfully to server");
  const db = client.db(dbName);
  insertCustomers(db, ()=> {
    retrieveCustomers(db, ()=> {
        retrieveCustomer(db, ()=> {
            client.close();
        });
    });
  });
});

এই সমাধান এবং @ ড্রে জ্যাকসন এরাই হ'ল 07/2020 পর্যন্ত নোডের সাথে কাজ করে। কানেক্ট কলব্যাকের আর্গুমেন্ট হিসাবে যা পাস করা হয়েছে তা ডিবি-র পরিবর্তে মঙ্গোস্লিয়েন্ট হয়, এজন্য আপনাকে এর থেকে ডিবি আনতে হবে। useUnifiedTopology: trueএগুলি ছাড়াও , এই সমাধানটি তালিকাভুক্ত করে , যা এখনকার দিনেরও প্রয়োজন।
কফি_ফ্যান

1

মঙ্গোডিবি ক্যোয়ারী মেমরিতে সঞ্চিত একটি অ্যারেতে একটি কার্সার ফিরিয়ে দেয়। অ্যারের ফলাফল অ্যাক্সেস করতে আপনাকে অবশ্যই .toArray()ক্যোয়ারির শেষে কল করতে হবে ।

  db.collection("customers").find({}).toArray() 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.