MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy mogę wykonać nieprzetworzone zapytanie MongoDB w sterowniku node-mongodb-native?

Uwaga:pytanie się zmieniło – zobacz aktualizacje poniżej.

Oryginalna odpowiedź:

Tak.

Zamiast:

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

Używasz go jako:

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

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

Aktualizacja

Po zmianie pytania i opublikowaniu kilku komentarzy staje się bardziej jasne, co chcesz zrobić.

Aby osiągnąć swój cel emulacji powłoki Mongo w Node, musisz przeanalizować polecenie wpisane przez użytkownika i wykonać odpowiednie polecenie, pamiętając:

  1. różnica między SpiderMonkey używanym przez powłokę Mongo a Node z V8 i libuv
  2. różnica między BSON i JSON
  3. fakt, że powłoka Mongo działa synchronicznie, a sterownik Node działa asynchronicznie

Ostatnia część będzie prawdopodobnie najtrudniejsza dla Ciebie. Pamiętaj, że w powłoce Mongo jest to całkowicie legalne:

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

W węźle .find() Metoda nie zwraca wartości, ale albo przyjmuje wywołanie zwrotne, albo zwraca obietnicę. To będzie trudne. db.test.find()[0].x; sprawa może być stosunkowo łatwa do załatwienia z obietnicami (jeśli dobrze je rozumiesz), ale będzie to trudniejsze:

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

i pamiętaj, że musisz obsługiwać dowolnie zagnieżdżone poziomy.

Protokół Mongo

Po przeczytaniu niektórych komentarzy myślę, że warto zauważyć, że to, co faktycznie wysyłasz na serwer Mongo, nie ma nic wspólnego z JavaScriptem, który piszesz w powłoce Mongo. Powłoka Mongo używa SpiderMonkey z wieloma predefiniowanymi funkcjami i obiektami.

Ale tak naprawdę nie wysyłasz JavaScriptu na serwer Mongo, więc nie możesz wysyłać rzeczy takich jak db.collection.find() . Zamiast tego wysyłasz binarne OP_QUERY struct z nazwą kolekcji zakodowaną jako cstring i zapytaniem zakodowanym jako BSON plus kilka flag binarnych. Zobacz:

BSON sam w sobie jest formatem binarnym z wieloma wartościami niskiego poziomu zdefiniowanymi jako bajty:

Najważniejsze jest to, że nie wysyłasz do serwera Mongo niczego, co przypomina to, co wpisujesz w powłoce Mongo. Powłoka Mongo analizuje rzeczy, które wpisujesz za pomocą parsera SpiderMonkey i wysyła żądania binarne do właściwego serwera Mongo. Powłoka Mongo używa JavaScript, ale nie komunikujesz się z serwerem Mongo w JavaScript.

Przykład

Nawet obiekt zapytania JSON nie jest wysyłany do Mongo jako JSON. Na przykład, gdy szukasz dokumentu z hello Właściwość równa "world", której użyłbyś {hello: 'world'} w JavaScript lub {"hello": "world"} w JSON, ale to jest przesyłane na serwer Mongo - przez powłokę Mongo lub przez dowolnego innego klienta Mongo:

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

Dlaczego jest tak inny

Aby zrozumieć, dlaczego składnia używana w Node jest tak różna od powłoki Mongo, zobacz odpowiedź:




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoid kończy się niepowodzeniem na Ruby 1.9.3

  2. MongoDB :odpytywanie dokumentów z dwoma równymi polami, $match i $eq

  3. Łatwy sposób na synchronizację danych między MongoDB i Apache Solr

  4. Dlaczego nie mogę znaleźć rekordu według _id in mongodb

  5. Mapowanie - Mongodb osadzony dokument w Symfony2