MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Posso executar uma consulta bruta do MongoDB no driver nativo do node-mongodb?


Observação:a pergunta mudou - veja as atualizações abaixo.

Resposta original:

Sim.

Ao invés de:
db.tableName.find({ col: 'value' })

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

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

Atualizar


Depois que você mudou sua pergunta e postou alguns comentários fica mais claro o que você quer fazer.

Para atingir seu objetivo de emular o shell Mongo no Node, você precisaria analisar o comando digitado pelo usuário e executar o comando apropriado, tendo em mente:
  1. a diferença entre SpiderMonkey usado pelo shell Mongo e Node com V8 e libuv
  2. a diferença entre BSON e JSON
  3. o fato de que o shell Mongo funciona de forma síncrona e o driver Node funciona de forma assíncrona

A última parte provavelmente será a parte mais difícil para você. Lembre-se que no shell Mongo isso é perfeitamente legal:
db.test.find()[0].x;

No Node o .find() O método não retorna o valor, mas recebe um retorno de chamada ou retorna uma promessa. Será complicado. O db.test.find()[0].x; case pode ser relativamente fácil de lidar com promessas (se você entender bem as promessas), mas isso será mais difícil:
db.test.find({x: db.test.find()[0].x});

e lembre-se de que você precisa lidar com níveis aninhados arbitrariamente.

O protocolo Mongo


Depois de ler alguns dos comentários, acho que vale a pena notar que o que você realmente envia para o servidor Mongo não tem nada a ver com o JavaScript que você escreve no shell do Mongo. O shell Mongo usa SpiderMonkey com várias funções e objetos predefinidos.

Mas você não envia JavaScript para o servidor Mongo, então não pode enviar coisas como db.collection.find() . Em vez disso, você envia um binário OP_QUERY struct com um nome de coleção codificado como um cstring e uma consulta codificada como BSON mais um monte de sinalizadores binários. Ver:

O próprio BSON é um formato binário com vários valores de baixo nível definidos como bytes:

A linha inferior é que você não envia para o servidor Mongo nada parecido com o que você insere no shell do Mongo. O shell Mongo analisa as coisas que você digita usando o analisador SpiderMonkey e envia solicitações binárias para o servidor Mongo real. O shell Mongo usa JavaScript, mas você não se comunica com o servidor Mongo em JavaScript.

Exemplo


Mesmo o objeto de consulta JSON não é enviado ao Mongo como JSON. Por exemplo, quando você está procurando por um documento com um hello propriedade igual a "world" você usaria {hello: 'world'} em JavaScript ou {"hello": "world"} em JSON, mas é isso que é enviado para o servidor Mongo - pelo shell Mongo ou por qualquer outro cliente Mongo:
\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00   

Por que é tão diferente


Para entender por que a sintaxe usada no Node é tão diferente do shell do Mongo, veja esta resposta: