MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Kann ich eine unformatierte MongoDB-Abfrage im node-mongodb-native-Treiber ausführen?

Hinweis:Die Frage hat sich geändert - siehe die Aktualisierungen unten.

Ursprüngliche Antwort:

Ja.

Statt:

db.tableName.find({ col: 'value' })

Sie verwenden es als:

db.collection('tableName').find({ col: 'value' }, (err, data) => {
    if (err) {
        // handle error
    } else {
        // you have data here
    }
});

Siehe:http://mongodb.github.io /node-mongodb-native/2.2/api/Collection.html#find

Aktualisieren

Nachdem Sie Ihre Frage geändert und einige Kommentare gepostet haben, ist klarer, was Sie tun möchten.

Um Ihr Ziel zu erreichen, die Mongo-Shell in Node zu emulieren, müssten Sie den vom Benutzer eingegebenen Befehl parsen und den entsprechenden Befehl ausführen, wobei Sie Folgendes beachten sollten:

  1. der Unterschied zwischen SpiderMonkey, der von der Mongo-Shell verwendet wird, und Node mit V8 und libuv
  2. der Unterschied zwischen BSON und JSON
  3. die Tatsache, dass die Mongo-Shell synchron arbeitet und der Node-Treiber asynchron arbeitet

Der letzte Teil wird wahrscheinlich der schwierigste Teil für Sie sein. Denken Sie daran, dass dies in der Mongo-Shell vollkommen legal ist:

db.test.find()[0].x;

Im Knoten die .find() -Methode gibt den Wert nicht zurück, nimmt aber entweder einen Rückruf entgegen oder gibt ein Promise zurück. Es wird schwierig. Der db.test.find()[0].x; Der Fall kann mit Versprechen relativ einfach zu handhaben sein (wenn Sie die Versprechen gut verstehen), aber dies wird schwieriger:

db.test.find({x: db.test.find()[0].x});

und denken Sie daran, dass Sie mit willkürlich verschachtelten Ebenen umgehen müssen.

Das Mongo-Protokoll

Nachdem ich einige der Kommentare gelesen habe, denke ich, dass es erwähnenswert ist, dass das, was Sie tatsächlich an den Mongo-Server senden, nichts mit dem JavaScript zu tun hat, das Sie in der Mongo-Shell schreiben. Die Mongo-Shell verwendet SpiderMonkey mit einer Reihe vordefinierter Funktionen und Objekte.

Aber Sie senden kein JavaScript an den Mongo-Server, also können Sie keine Dinge wie db.collection.find() senden . Stattdessen senden Sie eine binäre OP_QUERY struct mit einem als cstring codierten Sammlungsnamen und einer als BSON codierten Abfrage sowie einer Reihe binärer Flags. Siehe:

Der BSON ist selbst ein Binärformat mit einer Reihe von Low-Level-Werten, die als Bytes definiert sind:

Das Fazit ist, dass Sie nichts an den Mongo-Server senden, was dem ähnelt, was Sie in die Mongo-Shell eingeben. Die Mongo-Shell analysiert die Dinge, die Sie mit dem SpiderMonkey-Parser eingeben, und sendet binäre Anfragen an den eigentlichen Mongo-Server. Die Mongo-Shell verwendet JavaScript, aber Sie kommunizieren nicht mit dem Mongo-Server in JavaScript.

Beispiel

Auch das JSON-Abfrageobjekt wird nicht als JSON an Mongo gesendet. Zum Beispiel, wenn Sie nach einem Dokument mit einem hello suchen Eigenschaft gleich "world", würden Sie {hello: 'world'} verwenden in JavaScript oder {"hello": "world"} in JSON, aber das wird an den Mongo-Server gesendet - von der Mongo-Shell oder von einem anderen Mongo-Client:

\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00   

Warum es so anders ist

Um zu verstehen, warum sich die in Node verwendete Syntax so sehr von der Mongo-Shell unterscheidet, lesen Sie diese Antwort: