db.collection ist bei Verwendung von MongoClient v3.0 keine Funktion

132

Ich habe versucht, W3schools Tutorial auf NodeJS mit MongoDB.

Wenn ich versuche, dieses Beispiel in einer NodeJS-Umgebung zu implementieren und die Funktion mit einem AJAX-Aufruf aufzurufen, wird der folgende Fehler angezeigt:

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)

Nachfolgend finden Sie meinen implementierten Code:

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

Beachten Sie, dass der Fehler immer dann auftritt, wenn die Ausführung trifft:

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

Beachten Sie außerdem (falls es darauf ankommt), dass ich das neueste MongoDB-Paket für Node JS ( npm install mongodb ) installiert habe und die MongoDB-Version MongoDB Enterprise 3.4.4 mit dem MongoDB Node.js-Treiber v3.0.0-rc0 ist.

Elie Asmar
quelle
Haben Sie sichergestellt, dass: (1) die Datenbank ausgeführt wird (vorausgesetzt, es gab keinen Fehler, denke ich); (2) Die Datenbank mytestingdb ist vorhanden (versuchen Sie, mit robomongo / robo3t auf Ihre Verbindung zuzugreifen und die Sammlungen anzuzeigen). (3) Die Sammlungskunden sind tatsächlich vorhanden. Sagen Sie uns auch, wie Sie dieses Skript aufrufen und welche Version von Nodejs (wie haben Sie installiert?)
nbkhope
Die Datenbank und die Sammlung sind vorhanden (ich habe mit Studio 3t darauf zugegriffen). Ich debugge nodeJS, indem ich die Methode über einen AJAX-Aufruf aufrufe. Im Grunde werden die Haltepunkte erreicht und alles funktioniert einwandfrei, bis ich die oben angegebene Ausnahme erhalte. NodeJS Version ist v6.11.4
Elie Asmar
Ersetzen Sie dann den Code, der mit beginnt, durch db.collection()...ein Konsolenprotokoll, um festzustellen, ob er dort ankommt, kein Problem.
nbkhope
Die Datenbank und die Sammlung sind vorhanden (ich habe mit Studio 3t darauf zugegriffen). Ich debugge nodeJS, indem ich die Methode über einen AJAX-Aufruf aufrufe. Im Grunde werden die Haltepunkte erreicht und alles funktioniert einwandfrei, bis ich die oben angegebene Ausnahme erhalte. NodeJS Version ist v6.11.4
Elie Asmar

Antworten:

80

Ich bin auf dasselbe gestoßen. Ändern Sie in package.json die mongodb-Zeile in "mongodb": "^ 2.2.33". Sie müssen npm mongodb deinstallieren; dann npm installieren, um diese Version zu installieren.

Dies löste das Problem für mich. Scheint ein Fehler zu sein oder Dokumente müssen aktualisiert werden.

AyoO
quelle
15
Überprüfen Sie die Antwort von
MikaS
67
Ein Downgrade auf eine frühere Version ist keine wirkliche Lösung, sondern bedeutet nur, dass Sie sich nicht mit den API-Änderungen befasst haben, die dies verursacht haben
John Culviner
3
@ JohnCulviner - Dies war ein Zeitproblem; kein Faulheitsproblem. Dieses Problem trat auf, als das neue Update veröffentlicht wurde. Ich (und das Originalplakat) haben das offensichtlich nicht bemerkt. Zu diesem Zeitpunkt waren die Dokumente noch nicht aktualisiert. Sie wurden kurz darauf aktualisiert. Jeder, der dies ab sofort beheben möchte, sollte dem Kommentar von MikaS folgen und die aktualisierten Dokumente überprüfen. Ich habe dasselbe getan, nachdem die Dokumente aktualisiert wurden, und konnte mit der aktualisierten Version fortfahren.
AyoO
1
Ich bin jetzt auf dieses Problem gestoßen - ich hatte dieses Problem und hatte das "mongodb:" "3.0.2" in package.json installiert. Gibt es Probleme mit der neuen Version?
Logos_164
4
Hilft überhaupt nicht. Warum wird es als die richtige Antwort markiert?
CodingNow
480

Für Benutzer der Version 3.0 des nativen MongoDB-NodeJS-Treibers:

(Dies gilt für Personen mit "mongodb": "^ 3.0.0-rc0" oder einer späteren Version in package.json, die weiterhin die neueste Version verwenden möchten.)

In Version 2.x des nativen MongoDB-NodeJS-Treibers erhalten Sie das Datenbankobjekt als Argument für den Verbindungsrückruf:

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

Gemäß dem Änderungsprotokoll für 3.0 erhalten Sie jetzt stattdessen ein Client-Objekt, das das Datenbankobjekt enthält:

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

Die close()Methode wurde ebenfalls auf den Client verschoben. Der Code in der Frage kann daher übersetzt werden in:

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();
  });
}); 
Mika Sundland
quelle
Müssen wir jetzt var db = client.db('mytestingdb');jedes Mal diese ( ) zusätzliche Zeile schreiben, anstatt nur so zu schreiben ( MongoClient.connect('mongodb://localhost:27017/mytestingdb'))? Ich arbeite immer mit der gleichen Datenbank. Gibt es einen Ansatz, um diese zusätzliche Linie zu beseitigen? Es ist ein bisschen zeitaufwändig für mich.
Ozgrozer
7
@ozgrozer Klingt für mich so, als würden Sie sich bei jeder Anfrage mit der Datenbank verbinden. Das ist eine schlechte Idee. Sie können darüber lesen Sie hier . Wenn Sie nur einmal eine Verbindung herstellen, gibt es nur eine neue Leitung pro App, die Sie erstellen.
Mika Sundland
1
@MikaS Oh ja. Ich habe mich mit der Datenbank verbunden, wie du gesagt hast. Ich wusste nicht, dass wir uns einmal verbinden und die DB-Variable wiederverwenden können. Ich danke dir sehr.
Ozgrozer
1
Gute Antwort; Als ich herausfand, dass dies eine
Zeitverschwendung war
Ich habe den Client so implementiert, aber es gibt immer noch die gleichen Probleme (db.collection ist keine Funktion) in \ node_modules \ mongodb \ lib \ gridfs-stream \ index.js: 50: 27
alex351
33

Wenn Sie Version ^ 3.0.1 weiterhin verwenden möchten, beachten Sie die Änderungen an der Verwendung der MongoClient.connect()Methode. Der Rückruf wird nicht zurückgegeben, dbsondern zurückgegeben. Für diese clientFunktion wird eine Funktion aufgerufen db(dbname), die Sie aufrufen müssen, um die dbgesuchte Instanz abzurufen.

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();
});
ra9r
quelle
2
Diese Antwort ist aktueller und gilt für Version 3 des Treibers. Vielen Dank
Mohammad
1
Ich empfehle diese Lösung, sie ist besser für zukünftige Referenz geeignet.
Jamie Nicholl-Shelley
29
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);
        });
    })
})

Das einzige Problem mit Ihrem Code besteht darin, dass Sie auf das Objekt zugreifen, in dem sich der Datenbankhandler befindet. Sie müssen direkt auf die Datenbank zugreifen (siehe Datenbankvariable oben). Dieser Code gibt Ihre Datenbank in einem Array zurück und durchläuft sie dann und protokolliert den Namen für alle in der Datenbank.

Dre Jackson
quelle
Diese Antwort wird aufgrund ihrer Länge und ihres Inhalts als minderwertig eingestuft. Bitte geben Sie weitere Informationen an.
Wahyu Kristianto
Es ist nur so lange wie es sein muss. Diese Antwort hat mir geholfen.
Manuel Hernandez
1
@ ManuelHernandez froh, dass es geholfen hat :)
Dre Jackson
das ist die richtige ans. Bitte markieren Sie dies als korrekt ans.
Ninad Kambli
12

Huckepack auf @ MikkaS-Antwort für Mongo Client v3.x, ich brauchte nur das asynchrone / warten-Format, das wie folgt leicht modifiziert aussieht:

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.
}
Agarcian
quelle
7

Ich habe ein wenig experimentiert, um zu sehen, ob ich den Datenbanknamen als Teil der URL behalten kann. Ich bevorzuge die Versprechenssyntax, aber sie sollte immer noch für die Rückrufsyntax funktionieren. Beachten Sie, dass client.db () aufgerufen wird, ohne Parameter zu übergeben.

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

Meine package.json listet monbodb ^ 3.2.5 auf.

Die Option 'useNewUrlParser' ist nicht erforderlich, wenn Sie bereit sind, eine Verfallswarnung zu verarbeiten. Es ist jedoch ratsam, an dieser Stelle zu verwenden, bis Version 4 herauskommt, bei der vermutlich der neue Treiber der Standard ist und Sie die Option nicht mehr benötigen.

pwilcox
quelle
5

Ich habe es einfach gelöst, indem ich diese Codes ausgeführt habe:

 npm uninstall mongodb --save

 npm install mongodb@2.2.33 --save

Viel Spaß beim Codieren!

Saurabh Singh
quelle
4

Ich habe MongoDB Shell Version v3.6.4, unter Code verwenden Mongoclient, Es ist gut für mich:

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()");
 });
Gianluca Mazzeo
quelle
Diese Frage bezieht sich auf den Knotentreiber, nicht auf die Shell.
UpTheCreek
2

Wenn noch jemand versucht, diesen Fehler zu beheben, habe ich dies wie folgt getan.

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();
        });
    });
  });
});
Mahendra Bagul
quelle
1

MongoDB-Abfragen geben einen Cursor auf ein im Speicher gespeichertes Array zurück. Um auf das Ergebnis dieses Arrays zuzugreifen, müssen Sie .toArray()am Ende der Abfrage aufrufen .

  db.collection("customers").find({}).toArray() 
pmpc2
quelle