Wie mache ich rohe Mongodb-Operationen bei Mungos?

70

Ich frage dies, weil ich beim Schreiben von Komponententests die Testdatenbank löschen und einige Initialisierungsdaten einfügen sowie die Daten in Mongodb beim Testen überprüfen möchte. Also brauche ich rohe Operationen, um mongodb.

Wie macht man das bei Mungos? Was ich jetzt tun kann, ist einfach die Verbindung herzustellen und kein Dokument auf der offiziellen Website des Mungos zu finden.

 var mongoose = require('mongoose');
 mongoose.connect('mongo://localhost/shuzu_test');

 // get the connection
 var conn = mongoose.connection;

Aber wie geht's:

  1. Löschen Sie die Datenbank
  2. Erstellen Sie eine Sammlung
  3. Schreiben Sie einige Daten in eine Sammlung
  4. eine Sammlung abfragen
  5. eine Sammlung ablegen
Freilauf
quelle

Antworten:

51

Siehe den Abschnitt "Treiberzugriff" in den Dokumenten: http://mongoosejs.com/

Grundsätzlich können Sie auf den Node-Mongodb-Native- Treiber zugreifen, indem Sie dies tun, YourModel.collectionund dann können Sie insertoder removeoder dropoder was auch immer Sie benötigen.

Es gibt kein Dokument, aber mit diesem Ansatz erhalten Sie Zugriff auf alles hier: https://mongoosejs.com/docs/api.html#collection-js

Bearbeiten:

In Ihrem Fall möchten Sie möglicherweise die Verwendung von Mungo in Ihrer Testsuite überspringen und den Node-Mongodb-Native direkt verwenden oder sogar ein einfaches Mongodb-Shell-Skript schreiben , das vor Beginn Ihrer Tests ausgeführt werden kann.

Jamund Ferguson
quelle
1
Beim Thema "Mognodb-native direkt verwenden" habe ich festgestellt, dass Indizes in Mungo-Schemas nicht gut funktionieren, wenn ich mongodb-native verwende, um einige Daten direkt einzufügen.
Freilauf
Das ist interessant. Ich dachte, der sureIndex wurde beim Start ausgeführt? Hmm. Ahh ja, aber das ist in Ihrer Testsuite, also werden die Mongoose-Anrufe überhaupt nicht ausgeführt.
Jamund Ferguson
Ich habe ein komplexes MongoDB-Skript, das über die Befehlszeile wie folgt ausgeführt wird: $ mongo mydb task.js Da ich in meiner Serverumgebung keine Shell-Skripte ausführen kann und die obige Aufgabe planen muss, dachte ich, ich könnte das Mongo-Skript ausführen ein Knotenskript. Ist dies über den nativen Treiber möglich?
Sam
3
Diese Antwort bezieht sich auf eine Dokumentation, die nicht sehr klar ist. Warum nicht einfach den Code schreiben und auf die spezifische Seite in der Dokumentation verlinken?
Basickarl
3
Auf dieser Seite wird "Treiberzugriff" nicht mehr angezeigt.
RTF
71

Sie können Mongodb-Befehle mit dem nativen NodeJS-Treiber ausführen mongoose.connection.db. Dadurch wird auf den NodeJS MongoDB-Treiber zugegriffen, und Sie müssen kein Mungo-Modell erstellen .

Eine Beilage

mongoose.connection.db.collection('userCollection').insert({
  username: 'captain1',
  firstName: 'Steve',
  lastName: 'Rogers', 
});

Ein Update

mongoose.connection.db.collection('userCollection').update(
  {someFilterProperty: true},
  {$set: {
     siteId: new mongoose.mongo.ObjectId('56cb91bdc5946f14678934ba'),
     hasNewSiteId: true}},
  {multi: true});
});

Sie können jeden für diese Datenbank spezifischen Befehl mithilfe der Datenbankverbindungs-Datenbankreferenz senden mongoose.connection.db.

Dies ist das Mungo-API-Dokument: http://mongoosejs.com/docs/api.html#connection_Connection-db

Wichtig : Beachten Sie, dass sich einige Optionen im NodeJS-Treiber von den Optionen in MongoDB-Shell-Befehlen unterscheiden. Zum Beispiel findOneAndUpdate()verwendet returnOriginalanstelle von returnNewDocument. Weitere Informationen hierzu finden Sie hier und hier .

dampfbetrieben
quelle
1
Ich denke, dies ist der beste allgemeine Zugriff auf den nativen Treiber. Für die Suche in den Original - API - Dokumentation Mongoose, hier ist der Link für Connection.prototype.db: mongoosejs.com/docs/api.html#connection_Connection-db
edmundo096
1
Wie drucken Sie das Ergebnis der Abfrage?
CodyBugstein
Ich weiß, dass dies alt ist, aber nur für Leute, die dies noch finden, können Sie dies tun, um Ergebnisse zu Mongoose.connection.db.collection('collectionname').find({}).toArray((err,results) => { console.log(results); });
erzielen
8

Verwenden Sie diese Option, um Rohoperationen im Mungo auszuführen.

  Model_name.collection.insertMany(array, { ordered: false },function(err, success){
            console.log(success);
        });
Jitendra Rajput
quelle
3
Für diese Antwort muss ein Modell vorhanden sein. In der Frage wird gefragt, wie "Raw Mongodb" verwendet werden soll, was impliziert, dass der Benutzer möglicherweise nicht die zusätzlichen Anforderungen eines Modells wünscht.
Steampowered
2

Haben die gleichen Probleme gehabt, DBs nach Tests zu bereinigen, und die tatsächliche Antwort nur wegen fehlender "Codeblöcke" verwirrt, also graben Sie Dokumente / Code noch einmal, um dies zeitsparend zu veröffentlichen;)

Die Mongoose-Sammlung erweitert die Mongodb-Sammlung

/ * * section collection.js * http://mongoosejs.com/docs/api.html#collection-js * /

Schnittstelle CollectionBase erweitert mongodb.Collection {

Dokumentation: http://mongodb.github.io/node-mongodb-native/2.1/api/Collection.html

Gleiches gilt für die Verbindung:

Die Connection-Klasse, die durch require ('mongoose') verfügbar gemacht wird, ist tatsächlich die NativeConnection-Klasse des Treibers. connection.js definiert eine Basisklasse, die von den nativen Versionen erweitert wird. Siehe: http://mongoosejs.com/docs/api.html#drivers-node-mongodb-native-connection-js

So können alle "RAW" -Operationen für die Erfassung / Verbindung ausgeführt werden, vorausgesetzt, Sie haben

 var connection = mongoose.connection;

dann:

1. Lassen Sie die Datenbank fallen:

connection.dropDatabase()

2.Erstellen Sie eine Sammlung

connection.collection('newcollection') // creates if not exists

3.Schreiben Sie einige Daten in eine Sammlung

connection.collection('mybenotnewcollection').bulkWrite([
  { insertOne: { whatewer: { you: 'need' } } },
]);

4. eine Sammlung abfragen

Das ist offensichtlich keine Frage: findAll, find, aggregieren, alles erlaubt (siehe die Dokumente )

5.tropfen Sie eine Sammlung

connection.collection('notsonewcollection').drop()
2oppin
quelle
Funktioniert alles gut. Aber wie kann ich überprüfen, ob eine Sammlung vorhanden ist? Wenn ich connection.listCollections () deaktiviere, wird eine Fehlermeldung angezeigt: listCollections ist keine Funktion
mcAngular2
@ mcAngular2 Check docs mongoosejs.com/docs/api.html#connection_Connection-collections connection.collections
2oppin
2
const mongoose = require('mongoose');
mongoose.connect(uri, options);
var db = mongoose.connection;
db.once('open', function () {
  db.collection('collection').find().toArray(function(err, result){
        console.log(result);
  });
}
hardyRocks
quelle
2
Eine mündliche Erklärung ist oft hilfreich
con
0

Das Mungo-Objekt verfügt über einen Mongo-Prototyp, mit dem Sie auf den nativen Mongo-Treiber zugreifen können

mongoose.mongo
Arnav Singh
quelle