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:
- het verschil tussen SpiderMonkey gebruikt door de Mongo-shell en Node met V8 en libuv
- het verschil tussen BSON en JSON
- 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: