DB.Collection is geen functie bij het gebruik van MongoClient V3.0

Ik probeer W3schools-tutorial op nodejs met MongoDB.

Wanneer ik dit voorbeeld probeer in een Nodejs-omgeving te implementeren en de functie aan te roepen met een AJAX-oproep, kreeg ik de fout hieronder:

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)

vindt u hieronder mijn geïmplementeerde 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();
  });
});

Merk op dat de fout optreedt wanneer de uitvoering van de uitvoering:

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

Notitie, opmerking (voor het geval het aangeleert) dat ik het laatste MongoDB-pakket voor knooppunt JS (NPM-installatie MongoDB ) heeft geïnstalleerd, en de MongoDB-versie is MongoDB Enterprise 3.4.4, met MongoDB-knooppunt .js stuurprogramma v3.0.0-RC0.


Antwoord 1, Autoriteit 100%

Ik ben hetzelfde tegengekomen. In Package.json, verander MongoDB-lijn naar “MongoDB”: “^ 2.2.33”. U moet MongoDB NPM verwijderen door MongoDB-stuurprogramma / node_modules of enzovoort te verwijderen, en vervolgens NPM installeren om deze versie te installeren.

Dit heeft het probleem voor mij opgelost. Lijkt een bug of documenten moeten worden bijgewerkt.


Antwoord 2, Autoriteit 630%

voor mensen op versie 3.0 van de MongoDB Native Nodejs-stuurprogramma:

(dit is van toepassing op mensen met “MongoDB”: “^ 3.0.0-RC0”, of een latere versie in Package.json, die de nieuwste versie willen blijven gebruiken.)

in versie 2.x van de MongoDB Native Nodejs Driver U zou de database krijgen object als een argument voor de callback aansluiten:

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

Volgens de Changelog Voor 3.0 krijg je nu een clientobject met het database-object in plaats daarvan:

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

De close()Method is ook naar de klant verplaatst. De code in de vraag kan daarom worden vertaald naar:

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

Antwoord 3, autoriteit 49%

Voor degenen die versie ^3.0.1 willen blijven gebruiken, let op de wijzigingen in de manier waarop u de MongoClient.connect()-methode gebruikt. De callback retourneert niet dbmaar retourneert client, waartegen er een functie is genaamd db(dbname)die u moet aanroepen om de dbinstantie die u zoekt.

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

Antwoord 4, autoriteit 42%

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

Het enige probleem met uw code is dat u toegang krijgt tot het object dat de databasehandler bevat. U moet rechtstreeks toegang krijgen tot de database (zie databasevariabele hierboven). Deze code retourneert uw database in een array en loopt er dan doorheen en registreert de naam voor iedereen in de database.


Antwoord 5, autoriteit 16%

Piggy backing op @mikkas Antwoord voor Mongo Client v3.x, ik had net het ASYNC / AWAIT-formaat nodig, dat er iets is aangepast als dit:

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

Antwoord 6, Autoriteit 13%

Ik heb een beetje geëxperimenteerd om te zien of ik de database-naam kon houden als onderdeel van de URL. Ik geef de voorkeur aan de Promise Syntax, maar het moet nog steeds werken voor de callback-syntaxis. Merk op dat client.db () wordt genoemd zonder parameters te passeren.

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

Mijn pakket.json lijsten MONBODB ^ 3.2.5.

De optie ‘UseNewurlparser’ is niet vereist als u bereid bent om te gaan met een afschrijvingswaarscharing. Maar het is verstandig om op dit punt te gebruiken totdat versie 4 eruit komt waar vermoedelijk het nieuwe stuurprogramma de standaard is en u de optie niet meer nodig hebt.


Antwoord 7, Autoriteit 6%

Ik heb het eenvoudig opgelost via het uitvoeren van deze codes:

npm uninstall mongodb --save
 npm install [email protected] --save

Veel plezier met coderen!


Antwoord 8, autoriteit 6%

Als iemand nog steeds probeert deze fout op te lossen, heb ik dit als volgt gedaan.

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

Antwoord 9, autoriteit 5%

Ik heb MongoDB shell-versie v3.6.4, gebruik onderstaande code mongoclient, het is goed voor mij:

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

Antwoord 10, autoriteit 4%

Vroeger werkte het met de oudere versies van MongoDb-client ~ 2.2.33

Optie 1:U kunt dus ofwel de oudere versie gebruiken

npm uninstall mongodb --save
npm install [email protected] --save

Optie 2:Blijf de nieuwere versie (3.0 en hoger)gebruiken en pas de code een beetje aan.

let MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017', function(err, client){
  if(err) throw err;
  let db = client.db('myTestingDb');
  db.collection('customers').find().toArray(function(err, result){
    if(err) throw err;
    console.log(result);
    client.close();
    });
 });

Antwoord 11

MongoDB-query’s retourneren een cursor naar een array die in het geheugen is opgeslagen. Om toegang te krijgen tot het resultaat van die array moet u bellen met .toArray()aan het einde van de query.

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

Antwoord 12

late antwoord, maar misschien zal iemand het in de toekomst nodig hebben

We kunnen Async-functie maken die men onze verzameling en DB-instanties retourneert

const dBInstances = async () => {
  const collection = await db
    .then((client) => {
      const db = client.db();
      const collection = db.collection("AGGREGATION");
      return { collection: collection, db: db };
    })
    .catch((err) => {
      console.log(`Data base instances error ${err}`);
    });
  return collection;
};

En nadat we het resultaat van executie dbInstances () op deze manier kunnen gebruiken, gebruikte ik JS Destructurisation in voorbeeld hieronder

const test = async (req, res) => {
  const { collection, db } = await dBInstances();
  console.log(collection);
  console.log(db);
};

Nu hebben we gescheiden toegang tot onze DB en verzameling.

Other episodes