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

Kan jeg udføre en rå MongoDB-forespørgsel i node-mongodb-native driver?

Bemærk:Spørgsmålet er ændret - se opdateringerne nedenfor.

Oprindeligt svar:

Ja.

I stedet for:

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

Du bruger det som:

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

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

Opdater

Efter du har ændret dit spørgsmål og skrevet nogle kommentarer, er det mere klart, hvad du vil gøre.

For at nå dit mål med at emulere Mongo-skallen i Node skal du parse kommandoen skrevet af brugeren og udføre den passende kommando, mens du husker:

  1. forskellen mellem SpiderMonkey brugt af Mongo-skallen og Node med V8 og libuv
  2. forskellen mellem BSON og JSON
  3. det faktum, at Mongo-shell fungerer synkront, og Node-driveren fungerer asynkront

Den sidste del vil nok være den sværeste del for dig. Husk, at i Mongo-skallen er dette helt lovligt:

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

I Node er .find() metoden returnerer ikke værdien, men den tager enten et tilbagekald eller returnerer et løfte. Det bliver tricky. db.test.find()[0].x; sagen kan være forholdsvis let at håndtere med løfter (hvis du forstår løfterne godt), men dette vil være sværere:

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

og husk, at du skal håndtere vilkårligt indlejrede niveauer.

Mongo-protokollen

Efter at have læst nogle af kommentarerne, synes jeg, det er værd at bemærke, at det, du faktisk sender til Mongo-serveren, ikke har noget at gøre med det JavaScript, som du skriver i Mongo-skallen. Mongo-skallen bruger SpiderMonkey med en række foruddefinerede funktioner og objekter.

Men du sender faktisk ikke JavaScript til Mongo-serveren, så du kan ikke sende ting som db.collection.find() . I stedet sender du en binær OP_QUERY struct med et samlingsnavn kodet som en cstring og en forespørgsel kodet som BSON plus en masse binære flag. Se:

BSON er i sig selv et binært format med et antal lavniveauværdier defineret som bytes:

Den nederste linje er, at du ikke sender til Mongo-serveren noget, der ligner det, du indtaster i Mongo-skallen. Mongo-skallen analyserer de ting, du skriver ved hjælp af SpiderMonkey-parseren, og sender binære anmodninger til den faktiske Mongo-server. Mongo-skallen bruger JavaScript, men du kommunikerer ikke med Mongo-serveren i JavaScript.

Eksempel

Selv JSON-forespørgselsobjektet sendes ikke til Mongo som JSON. For eksempel, når du søger efter et dokument med en hello egenskab lig med "verden" ville du bruge {hello: 'world'} i JavaScript eller {"hello": "world"} i JSON, men dette er, hvad der sendes til Mongo-serveren - af Mongo-skallen eller af enhver anden Mongo-klient:

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

Hvorfor er det så anderledes

For at forstå, hvorfor syntaksen brugt i Node er så forskellig fra Mongo-skallen, se dette svar:




  1. Sænk Kafka Stream til MongoDB ved hjælp af PySpark Structured Streaming

  2. Hvordan installerer man php-redis-udvidelsen ved hjælp af den officielle PHP Docker-image-tilgang?

  3. Forespørgsel Mongodb Subdocuments fejl Konvertering af cirkulær struktur til JSON

  4. Hurtig referencevejledning til forskellige NoSQL-databaser