MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Мога ли да изпълня необработена MongoDB заявка в node-mongodb-native драйвер?

Забележка:Въпросът е променен – вижте актуализациите по-долу.

Оригинален отговор:

Да.

Вместо:

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

Използвате го като:

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

Вижте:http://mongodb.github.io /node-mongodb-native/2.2/api/Collection.html#find

Актуализация

След като променихте въпроса си и публикувахте коментари, вече е по-ясно какво искате да направите.

За да постигнете целта си да емулирате обвивката на Mongo в Node, ще трябва да анализирате командата, въведена от потребителя, и да изпълните подходящата команда, като имате предвид:

  1. разликата между SpiderMonkey, използван от обвивката на Mongo и Node с V8 и libuv
  2. разликата между BSON и JSON
  3. фактът, че обвивката на Mongo работи синхронно и драйверът на Node работи асинхронно

Последната част вероятно ще бъде най-трудната част за вас. Не забравяйте, че в обвивката на Mongo това е напълно законно:

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

В Node .find() методът не връща стойността, но или приема обратно извикване, или връща обещание. Ще бъде трудно. db.test.find()[0].x; случай може да е относително лесен за справяне с обещания (ако разбирате обещанията добре), но това ще бъде по-трудно:

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

и не забравяйте, че трябва да боравите с произволно вложени нива.

Протоколът Mongo

След като прочетох някои от коментарите, мисля, че си струва да се отбележи, че това, което всъщност изпращате на сървъра на Mongo, няма нищо общо с JavaScript, който пишете в обвивката на Mongo. Обвивката Mongo използва SpiderMonkey с редица предварително дефинирани функции и обекти.

Но всъщност не изпращате JavaScript към Mongo сървъра, така че не можете да изпращате неща като db.collection.find() . По-скоро изпращате двоичен OP_QUERY struct с име на колекция, кодирано като cstring и заявка, кодирана като BSON плюс куп двоични флагове. Вижте:

Самият BSON е двоичен формат с редица стойности на ниско ниво, дефинирани като байтове:

Изводът е, че не изпращате до сървъра на Mongo нищо, което да прилича на това, което въвеждате в обвивката на Mongo. Обвивката на Mongo анализира нещата, които въвеждате, използвайки парсера SpiderMonkey и изпраща двоични заявки към действителния сървър на Mongo. Обвивката на Mongo използва JavaScript, но вие не комуникирате със сървъра на Mongo в JavaScript.

Пример

Дори обектът на заявката JSON не се изпраща на Mongo като JSON. Например, когато търсите документ с hello свойство, равно на "свят", бихте използвали {hello: 'world'} в JavaScript или {"hello": "world"} в JSON, но това е, което се изпраща до сървъра на Mongo - от обвивката на Mongo или от всеки друг клиент на Mongo:

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

Защо е толкова различно

За да разберете защо синтаксисът, използван в Node, е толкова различен от обвивката на Mongo, вижте този отговор:




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да маршалирам json низ към bson документ за запис в MongoDB?

  2. възстановяването на дъмп с mongodb е неуспешно

  3. Как да преобразувам JSON обектна структура в точкова нотация?

  4. Драйвер Mongodb:липсва разделителна наклонена черта между хостове и опции

  5. $push еквивалент за карта в mongo