sql >> Databáze >  >> NoSQL >> MongoDB

Mohu provést nezpracovaný dotaz MongoDB v node-mongodb-native driveru?

Poznámka:Otázka se změnila – viz aktualizace níže.

Původní odpověď:

Ano.

Místo:

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

Používáte jej jako:

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

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

Aktualizovat

Poté, co změníte svou otázku a odešlete nějaké komentáře, je jasnější, co chcete dělat.

Abyste dosáhli svého cíle emulovat Mongo shell v Node, museli byste analyzovat příkaz zadaný uživatelem a provést příslušný příkaz, přičemž byste měli mít na paměti:

  1. rozdíl mezi SpiderMonkey používaným prostředím Mongo a Node s V8 a libuv
  2. rozdíl mezi BSON a JSON
  3. skutečnost, že prostředí Mongo funguje synchronně a ovladač Node funguje asynchronně

Poslední část pro vás bude pravděpodobně nejtěžší. Pamatujte, že v Mongo shellu je to naprosto legální:

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

V uzlu .find() metoda nevrací hodnotu, ale buď vezme zpětné volání, nebo vrátí příslib. Bude to záludné. db.test.find()[0].x; Případ může být relativně snadno zvládnutelný pomocí slibů (pokud slibům dobře rozumíte), ale toto bude těžší:

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

a pamatujte si, že musíte zvládnout libovolně vnořené úrovně.

Protokol Mongo

Po přečtení některých komentářů si myslím, že stojí za zmínku, že to, co skutečně odešlete na server Mongo, nemá nic společného s JavaScriptem, který napíšete do shellu Mongo. Shell Mongo používá SpiderMonkey s řadou předdefinovaných funkcí a objektů.

Ale ve skutečnosti neposíláte JavaScript na server Mongo, takže nemůžete odesílat věci jako db.collection.find() . Spíše odešlete binární OP_QUERY struct s názvem kolekce zakódovaným jako cstring a dotazem zakódovaným jako BSON plus hromada binárních příznaků. Viz:

BSON je sám o sobě binární formát s řadou hodnot nízké úrovně definovaných jako bajty:

Pointa je, že na server Mongo nepošlete nic, co by se podobalo tomu, co zadáte do shellu Mongo. Shell Mongo analyzuje věci, které napíšete, pomocí analyzátoru SpiderMonkey a odesílá binární požadavky na skutečný server Mongo. Shell Mongo používá JavaScript, ale se serverem Mongo nekomunikujete v JavaScriptu.

Příklad

Ani objekt dotazu JSON není odeslán do Mongo jako JSON. Například když hledáte dokument s hello vlastnost rovnající se "svět" byste použili {hello: 'world'} v JavaScriptu nebo {"hello": "world"} v JSON, ale toto se odesílá na server Mongo – pomocí prostředí Mongo nebo jakéhokoli jiného klienta Mongo:

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

Proč je to tak odlišné

Chcete-li pochopit, proč se syntaxe používaná v Node tak liší od prostředí Mongo, podívejte se na tuto odpověď:




  1. gem-install mongoidu hází neinicializovanou konstantu v Ruby, funguje v irb

  2. Spark neprovádí úkoly

  3. mongodb filtrovat dokumenty s délkou, šířkou a konkrétní vzdáleností

  4. Redis:je možné skončit platnost prvku v poli nebo tříděné sadě?