MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Puis-je exécuter une requête MongoDB brute dans le pilote node-mongodb-native ?

Remarque :La question a changé - voir les mises à jour ci-dessous.

Réponse originale :

Oui.

Au lieu de :

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

Vous l'utilisez comme :

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

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

Mettre à jour

Une fois que vous avez modifié votre question et posté des commentaires, ce que vous voulez faire est plus clair.

Pour atteindre votre objectif d'émulation du shell Mongo dans Node, vous devez analyser la commande tapée par l'utilisateur et exécuter la commande appropriée en gardant à l'esprit :

  1. la différence entre SpiderMonkey utilisé par le shell Mongo et Node avec V8 et libuv
  2. la différence entre BSON et JSON
  3. le fait que le shell Mongo fonctionne de manière synchrone et que le pilote Node fonctionne de manière asynchrone

La dernière partie sera probablement la plus difficile pour vous. N'oubliez pas que dans le shell Mongo, c'est parfaitement légal :

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

Dans Node le .find() La méthode ne renvoie pas la valeur mais elle prend un rappel ou renvoie une promesse. Ce sera délicat. Le db.test.find()[0].x; cas peut être relativement facile à gérer avec des promesses (si vous comprenez bien les promesses) mais ce sera plus difficile :

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

et rappelez-vous que vous devez gérer des niveaux arbitrairement imbriqués.

Le protocole Mongo

Après avoir lu certains des commentaires, je pense qu'il convient de noter que ce que vous envoyez réellement au serveur Mongo n'a rien à voir avec le JavaScript que vous écrivez dans le shell Mongo. Le shell Mongo utilise SpiderMonkey avec un certain nombre de fonctions et d'objets prédéfinis.

Mais vous n'envoyez pas réellement de JavaScript au serveur Mongo, vous ne pouvez donc pas envoyer des choses comme db.collection.find() . Vous envoyez plutôt un OP_QUERY binaire struct avec un nom de collection encodé en tant que cstring et une requête encodée en BSON plus un tas de drapeaux binaires. Voir :

Le BSON est lui-même un format binaire avec un certain nombre de valeurs de bas niveau définies en octets :

En fin de compte, vous n'envoyez rien au serveur Mongo qui ressemble à ce que vous entrez dans le shell Mongo. Le shell Mongo analyse les éléments que vous tapez à l'aide de l'analyseur SpiderMonkey et envoie des requêtes binaires au serveur Mongo réel. Le shell Mongo utilise JavaScript mais vous ne communiquez pas avec le serveur Mongo en JavaScript.

Exemple

Même l'objet de requête JSON n'est pas envoyé à Mongo en tant que JSON. Par exemple, lorsque vous recherchez un document avec un hello propriété égale à "world", vous utiliseriez {hello: 'world'} en JavaScript ou {"hello": "world"} en JSON mais c'est ce qui est envoyé au serveur Mongo - par le shell Mongo ou par tout autre client Mongo :

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

Pourquoi c'est si différent

Pour comprendre pourquoi la syntaxe utilisée dans Node est si différente de celle du shell Mongo, consultez cette réponse :