sql >> Database >  >> NoSQL >> MongoDB

Kan ik een onbewerkte MongoDB-query uitvoeren in node-mongodb-native driver?

Opmerking:de vraag is gewijzigd - zie de updates hieronder.

Oorspronkelijk antwoord:

Ja.

In plaats van:

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

Je gebruikt het als:

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

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

Bijwerken

Nadat je je vraag hebt gewijzigd en enkele opmerkingen hebt geplaatst, is het duidelijker wat je wilt doen.

Om uw doel van het emuleren van de Mongo-shell in Node te bereiken, moet u de door de gebruiker getypte opdracht ontleden en de juiste opdracht uitvoeren, rekening houdend met:

  1. het verschil tussen SpiderMonkey gebruikt door de Mongo-shell en Node met V8 en libuv
  2. het verschil tussen BSON en JSON
  3. het feit dat de Mongo-shell synchroon werkt en de Node-driver asynchroon

Het laatste deel zal waarschijnlijk het moeilijkste deel voor je zijn. Onthoud dat dit in de Mongo-schaal volkomen legaal is:

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

In Node de .find() methode retourneert de waarde niet, maar vereist een callback of retourneert een belofte. Het zal lastig zijn. De db.test.find()[0].x; geval kan relatief eenvoudig zijn om met beloften om te gaan (als u de beloften goed begrijpt), maar dit zal moeilijker zijn:

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

en onthoud dat je willekeurig geneste niveaus moet afhandelen.

Het Mongo-protocol

Na het lezen van enkele opmerkingen denk ik dat het de moeite waard is om op te merken dat wat je daadwerkelijk naar de Mongo-server stuurt niets te maken heeft met het JavaScript dat je in de Mongo-shell schrijft. De Mongo-shell gebruikt SpiderMonkey met een aantal vooraf gedefinieerde functies en objecten.

Maar u stuurt geen JavaScript naar de Mongo-server, dus u kunt geen dingen als db.collection.find() verzenden . In plaats daarvan stuur je een binaire OP_QUERY struct met een collectienaam gecodeerd als een cstring en een query gecodeerd als BSON plus een aantal binaire vlaggen. Zie:

De BSON is zelf een binair formaat met een aantal lage waarden gedefinieerd als bytes:

Het komt erop neer dat u niets naar de Mongo-server stuurt dat lijkt op wat u in de Mongo-shell invoert. De Mongo-shell parseert de dingen die je typt met de SpiderMonkey-parser en stuurt binaire verzoeken naar de eigenlijke Mongo-server. De Mongo-shell gebruikt JavaScript, maar u communiceert niet met de Mongo-server in JavaScript.

Voorbeeld

Zelfs het JSON-queryobject wordt niet als JSON naar Mongo verzonden. Als u bijvoorbeeld naar een document zoekt met een hello eigenschap gelijk aan "world" die u zou gebruiken {hello: 'world'} in JavaScript of {"hello": "world"} in JSON, maar dit wordt naar de Mongo-server gestuurd - door de Mongo-shell of door een andere Mongo-client:

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

Waarom het zo anders is

Zie dit antwoord om te begrijpen waarom de syntaxis die in Node wordt gebruikt zo verschilt van de Mongo-shell:




  1. Json importeren uit bestand in mongoDB met behulp van mongoimport

  2. Java/Mongodb-verificatie

  3. Manieren om gegevensversiebeheer in MongoDB te implementeren

  4. Redis Key-vervalmelding met Jedis