sql >> Databasteknik >  >> NoSQL >> MongoDB

Kan jag köra en rå MongoDB-fråga i node-mongodb-native drivrutin?

Obs! Frågan har ändrats – se uppdateringarna nedan.

Ursprungligt svar:

Ja.

Istället för:

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

Du använder 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

Uppdatera

Efter att du ändrat din fråga och postat några kommentarer är det tydligare vad du vill göra.

För att uppnå ditt mål att emulera Mongo-skalet i Node skulle du behöva analysera kommandot som skrivits av användaren och utföra lämpligt kommando samtidigt som du kommer ihåg:

  1. skillnaden mellan SpiderMonkey som används av Mongo-skalet och Node med V8 och libuv
  2. skillnaden mellan BSON och JSON
  3. det faktum att Mongo-skalet fungerar synkront och Node-drivrutinen fungerar asynkront

Den sista delen kommer förmodligen att vara den svåraste delen för dig. Kom ihåg att i Mongo-skalet är detta helt lagligt:

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

I Node visas .find() Metoden returnerar inte värdet men den tar antingen en återuppringning eller returnerar ett löfte. Det kommer att bli knepigt. db.test.find()[0].x; fall kan vara relativt lätt att hantera med löften (om du förstår löftena väl) men detta kommer att bli svårare:

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

och kom ihåg att du måste hantera godtyckligt kapslade nivåer.

Mongo-protokollet

Efter att ha läst några av kommentarerna tycker jag att det är värt att notera att det du faktiskt skickar till Mongo-servern inte har något att göra med JavaScriptet som du skriver i Mongo-skalet. Mongo-skalet använder SpiderMonkey med ett antal fördefinierade funktioner och objekt.

Men du skickar faktiskt inte JavaScript till Mongo-servern så du kan inte skicka saker som db.collection.find() . Snarare skickar du en binär OP_QUERY struct med ett samlingsnamn kodat som en cstring och en fråga kodad som BSON plus ett gäng binära flaggor. Se:

BSON är i sig ett binärt format med ett antal lågnivåvärden definierade som bytes:

Summan av kardemumman är att du inte skickar till Mongo-servern något som liknar det du anger i Mongo-skalet. Mongo-skalet analyserar de saker som du skriver med hjälp av SpiderMonkey-parsern och skickar binära förfrågningar till den faktiska Mongo-servern. Mongo-skalet använder JavaScript men du kommunicerar inte med Mongo-servern i JavaScript.

Exempel

Inte ens JSON-frågeobjektet skickas till Mongo som JSON. Till exempel när du söker efter ett dokument med en hello egenskap lika med "värld" skulle du använda {hello: 'world'} i JavaScript eller {"hello": "world"} i JSON men det här är vad som skickas till Mongo-servern - av Mongo-skalet eller av någon annan Mongo-klient:

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

Varför det är så annorlunda

För att förstå varför syntaxen som används i Node skiljer sig så mycket från Mongo-skalet, se det här svaret:




  1. Hur beräknar man den löpande summan med aggregat?

  2. Läs BSON (mongoDB) till POJO med GSON och TypeAdapter

  3. Redis:Det gick inte att öppna .rdb för att spara:Tillstånd nekad

  4. Hur hanterar man pagineringsfrågor korrekt med mongodb och php?