MongoClient v3.0 का उपयोग करते समय db.collection एक फ़ंक्शन नहीं है


132

मैं MongoDB के साथ नोडजेएस पर W3schools ट्यूटोरियल की कोशिश कर रहा हूं

जब मैं नोडजेएस वातावरण में इस उदाहरण को लागू करने का प्रयास करता हूं और 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) {}

इसके अलावा, ध्यान दें (यदि यह मामला मायने रखता है) कि मैंने नोड JS ( npm स्थापित मोंगोडब ) के लिए नवीनतम MongoDB पैकेज स्थापित किया है , और MongoDB संस्करण MongoDB Enterprise 3.4.4 है, MongoDB Node.js ड्राइवर के साथ X3.0.0-rc0 है।


क्या आपने यह सुनिश्चित किया है: (1) डेटाबेस चल रहा है (इसमें कोई त्रुटि नहीं थी, मुझे ऐसा लगता है); (2) डेटाबेस mytestingdb मौजूद है (अपने कनेक्शन तक पहुंचने और संग्रह देखने के लिए रोबोमोंगो / रोबो 3 का उपयोग करने का प्रयास करें) (3) संग्रह ग्राहक वास्तव में मौजूद हैं; हमें यह भी बताएं कि आप उस स्क्रिप्ट को कैसे कॉल कर रहे हैं और Nodejs का कौन सा संस्करण (आपने कैसे स्थापित किया?)
nbkhope

डेटाबेस और संग्रह मौजूद है (मैंने स्टूडियो 3t का उपयोग करके उन्हें एक्सेस किया है)। मैं एक AJAX कॉल के माध्यम से विधि को कॉल करके नोडजेएस डिबग कर रहा हूं, मूल रूप से ब्रेकपॉइंट्स हिट हो रहे हैं और जब तक मुझे ऊपर बताए गए अपवाद नहीं मिलते तब तक सब कुछ ठीक रहता है। NodeJS संस्करण v6.11.4 है
एली

फिर उस कोड को बदलें जो db.collection()...कंसोल लॉग के साथ शुरू होता है यह देखने के लिए कि क्या यह वहां हो जाता है, कोई समस्या नहीं है।
nbkhope 20

डेटाबेस और संग्रह मौजूद है (मैंने स्टूडियो 3t का उपयोग करके उन्हें एक्सेस किया है)। मैं एक AJAX कॉल के माध्यम से विधि को कॉल करके नोडजेएस डिबग कर रहा हूं, मूल रूप से ब्रेकपॉइंट्स हिट हो रहे हैं और जब तक मुझे ऊपर बताए गए अपवाद नहीं मिलते तब तक सब कुछ ठीक रहता है। NodeJS संस्करण v6.11.4 है
एलि

के संभावित डुप्लिकेट stackoverflow.com/questions/43779323/... stackoverflow.com/questions/34827397/...
nbkhope

जवाबों:


80

मैंने उसी चीज का सामना किया। Package.json में, mongodb लाइन को "mongodb" में बदलें: "^ 2.2.33"। आपको mongodb की स्थापना रद्द करने की आवश्यकता होगी; तब npm इस संस्करण को स्थापित करने के लिए स्थापित करें।

इससे मेरे लिए समस्या हल हो गई। बग या डॉक्स होने का अनुमान लगाया जाना चाहिए।


15
MikaS का उत्तर देखें
hartmut 19

67
एक पुराने संस्करण में अपग्रेड करना वास्तव में एक समाधान नहीं है, इसका मतलब है कि आप एपीआई परिवर्तनों को देखने से परेशान नहीं हैं, जो इसका कारण है
जॉन कुलीनर

3
@ जॉनकोलिनर - यह एक समय मुद्दा था; आलस्य का मुद्दा नहीं। यह समस्या तब हुई जब वे नए अपडेट को जारी करने की प्रक्रिया में थे। मैंने और मूल पोस्टर) जाहिर तौर पर इसका एहसास नहीं किया। उस समय, डॉक्स अभी तक अपडेट नहीं किए गए थे। कुछ ही समय बाद उन्हें अपडेट कर दिया गया। जो कोई भी अब तक इसे हल करने के लिए देख रहा है, उसे मीकास की टिप्पणी का पालन करना चाहिए और अपडेट किए गए डॉक्स की समीक्षा करनी चाहिए .. मैंने डॉक्स अपडेट किए जाने के बाद और उन्नत संस्करण के साथ जारी रखने में सक्षम था।
17

1
इस पार अब आ रहा है - मैं इस मुद्दे पर चल रहा था और पैकेज में "mongodb:" "3.0.2" था। json, क्या नए संस्करण के साथ मुद्दे हैं?
लोगोस_164

4
बिल्कुल मदद नहीं करता है। इसे सही उत्तर के रूप में क्यों चिह्नित किया गया है?
कोडिंगनॉ

482

MongoDB देशी NodeJS ड्राइवर के 3.0 संस्करण पर लोगों के लिए:

(यह "मोंगोडब": "^ 3.0.0-rc0" या पैकेज में बाद के संस्करण वाले लोगों पर लागू होता है। यह नवीनतम संस्करण का उपयोग करना चाहते हैं।)

MongoDB देशी NodeJS ड्राइवर के संस्करण 2.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
@ozgrozer मुझे लगता है कि आप हर अनुरोध के लिए db से जुड़ रहे हैं। यह एक बुरा विचार है। आप इसके बारे में यहां पढ़ सकते हैं । यदि आप केवल एक बार कनेक्ट करते हैं तो आपके द्वारा बनाए गए ऐप के लिए केवल एक नई लाइन है।
मिका सुंदरलैंड

1
@ मायका ओह हां। मैं आपके कहे अनुसार db से जुड़ रहा था। मुझे नहीं पता था कि हम एक बार कनेक्ट कर सकते हैं और db वैरिएबल का पुनः उपयोग कर सकते हैं। बहुत बहुत धन्यवाद।
ozgrozer

1
बहुत बढ़िया जवाब; यह पता लगाना एक समय चूसना था, मुझे RTFM
Mr.Budris

मैं बहुत की तरह ग्राहक को लागू किया था, लेकिन वहां अभी भी एक ही समस्या है (db.collection कार्य नहीं है) कर रहे हैं अंदर \ node_modules \ MongoDB \ lib \ gridfs धारा \ index.js: 50: 27
alex351

34

उन लोगों के लिए जो संस्करण ^ 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
मैं इस समाधान की सलाह देता हूं, यह भविष्य के संदर्भ के लिए अधिक उपयुक्त है।
जेमी निकोल-शेली

31
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);
        });
    })
})

आपके कोड की एकमात्र समस्या यह है कि आप डेटाबेस हैंडलर को धारण करने वाली वस्तु तक पहुंच रहे हैं। आपको डेटाबेस को सीधे एक्सेस करना चाहिए (ऊपर डेटाबेस चर देखें)। यह कोड आपके डेटाबेस को एक सरणी में लौटा देगा और फिर यह इसके माध्यम से लूप करता है और डेटाबेस में सभी के लिए नाम लॉग करता है।


यह उत्तर इसकी लंबाई और सामग्री के कारण निम्न गुणवत्ता के रूप में चिह्नित है। कृपया अधिक जानकारी प्रदान करें।
वाहू क्रिस्टियन्टो

यह केवल तब तक है जब तक इसकी आवश्यकता है। इस जवाब से मुझे मदद मिली।
मैनुअल हर्नांडेज़

1
@ मैनुएल हर्नांडेज़ को खुशी हुई कि इसने मदद की :)
Dre जैक्सन

यह सही उत्तर है। कृपया इसे सही अंक के रूप में चिह्नित करें।
निनाद कांबली

12

Mongo Client v3.x के लिए @MikkaS उत्तर पर पिग्गी बैकिंग, मुझे बस async / प्रतीक्षा प्रारूप की आवश्यकता है, जो इस रूप में थोड़ा संशोधित दिखता है:

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

मैंने यह देखने के लिए थोड़ा प्रयोग किया कि क्या मैं डेटाबेस नाम को यूआरएल के हिस्से के रूप में रख सकता हूं। मैं वादा सिंटैक्स पसंद करता हूं लेकिन यह अभी भी कॉलबैक सिंटैक्स के लिए काम करना चाहिए। उस क्लाइंट के नीचे सूचना। Db () को किसी भी पैरामीटर को पारित किए बिना कहा जाता है।

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));

मेरा पैकेज.जॉन मोनबोडब ^ 3.2.5 को सूचीबद्ध करता है।

यदि आप डिप्रेशन चेतावनी से निपटने के लिए तैयार हैं, तो 'useNewUrlParser' विकल्प की आवश्यकता नहीं है। लेकिन इस बिंदु पर उपयोग करना बुद्धिमान है जब तक कि संस्करण 4 बाहर नहीं आता है जहां संभवतः नया चालक डिफ़ॉल्ट होगा और आपको विकल्प की आवश्यकता नहीं होगी।


5

मैंने इन कोड को चलाने के माध्यम से इसे आसानी से हल किया:

 npm uninstall mongodb --save

 npm install mongodb@2.2.33 --save

हैप्पी कोडिंग!


4

मेरे पास MongoDB शेल वर्जन v3.6.4 है, नीचे दिए गए कोड का उपयोग mongoclient है, यह मेरे लिए अच्छा है:

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 के साथ काम करते हैं। कनेक्ट कॉलबैक के तर्क के रूप में जो पारित किया जाता है वह एक db के बजाय MongoClient है, यही कारण है कि आपको इसमें से db लाने की आवश्यकता है। इसके अलावा, यह समाधान उस सूची को भी सूचीबद्ध करता है useUnifiedTopology: true, जिसकी जरूरत अब और भी है।
कॉफी_फान

1

MongoDB क्वेरीज़ स्मृति में संग्रहीत सरणी में एक कर्सर लौटाती है। उस सरणी के परिणाम तक पहुंचने .toArray()के लिए आपको क्वेरी के अंत में कॉल करना होगा ।

  db.collection("customers").find({}).toArray() 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.