MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Posso eseguire una query MongoDB grezza nel driver nativo di node-mongodb?

Nota:la domanda è cambiata:consulta gli aggiornamenti di seguito.

Risposta originale:

Sì.

Invece di:

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

Lo usi come:

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

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

Aggiorna

Dopo aver modificato la tua domanda e pubblicato alcuni commenti, è più chiaro cosa vuoi fare.

Per raggiungere il tuo obiettivo di emulare la shell Mongo in Node dovresti analizzare il comando digitato dall'utente ed eseguire il comando appropriato tenendo presente:

  1. la differenza tra SpiderMonkey utilizzato dalla shell Mongo e Node con V8 e libuv
  2. la differenza tra BSON e JSON
  3. il fatto che la shell Mongo funzioni in modo sincrono e il driver Node funzioni in modo asincrono

L'ultima parte sarà probabilmente la parte più difficile per te. Ricorda che nella shell Mongo questo è perfettamente legale:

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

Nel nodo .find() il metodo non restituisce il valore ma accetta un callback o restituisce una promessa. Sarà difficile. Il db.test.find()[0].x; il caso potrebbe essere relativamente facile da gestire con le promesse (se capisci bene le promesse), ma questo sarà più difficile:

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

e ricorda che devi gestire livelli nidificati arbitrariamente.

Il protocollo Mongo

Dopo aver letto alcuni dei commenti, penso che valga la pena notare che ciò che invii effettivamente al server Mongo non ha nulla a che fare con il JavaScript che scrivi nella shell Mongo. La shell Mongo utilizza SpiderMonkey con una serie di funzioni e oggetti predefiniti.

Ma in realtà non invii JavaScript al server Mongo, quindi non puoi inviare cose come db.collection.find() . Piuttosto invii un OP_QUERY binario struct con un nome di raccolta codificato come cstring e una query codificata come BSON più un gruppo di flag binari. Vedi:

Il BSON è esso stesso un formato binario con un numero di valori di basso livello definiti come byte:

La linea di fondo è che non invii al server Mongo nulla che assomigli a ciò che inserisci nella shell Mongo. La shell Mongo analizza le cose che digiti usando il parser SpiderMonkey e invia richieste binarie al server Mongo effettivo. La shell Mongo utilizza JavaScript ma non comunichi con il server Mongo in JavaScript.

Esempio

Anche l'oggetto query JSON non viene inviato a Mongo come JSON. Ad esempio, quando cerchi un documento con un hello proprietà uguale a "world" useresti {hello: 'world'} in JavaScript o {"hello": "world"} in JSON ma questo è ciò che viene inviato al server Mongo - dalla shell Mongo o da qualsiasi altro client Mongo:

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

Perché è così diverso

Per capire perché la sintassi utilizzata in Node è così diversa dalla shell Mongo, vedi questa risposta: