sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Puedo ejecutar una consulta MongoDB sin formato en el controlador nativo de node-mongodb?

Nota:la pregunta ha cambiado; consulte las actualizaciones a continuación.

Respuesta original:

Sí.

En lugar de:

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

Lo usas como:

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

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

Actualizar

Después de cambiar su pregunta y publicar algunos comentarios, es más claro lo que quiere hacer.

Para lograr su objetivo de emular el shell de Mongo en Node, necesitaría analizar el comando escrito por el usuario y ejecutar el comando apropiado teniendo en cuenta:

  1. la diferencia entre SpiderMonkey usado por Mongo shell y Node con V8 y libuv
  2. la diferencia entre BSON y JSON
  3. el hecho de que el shell de Mongo funciona de forma síncrona y el controlador Node funciona de forma asíncrona

La última parte probablemente será la más difícil para ti. Recuerda que en el shell de Mongo esto es perfectamente legal:

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

En Node el .find() El método no devuelve el valor, pero recibe una devolución de llamada o devuelve una promesa. Será complicado. El db.test.find()[0].x; El caso puede ser relativamente fácil de manejar con promesas (si entiendes bien las promesas), pero esto será más difícil:

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

y recuerda que necesitas manejar niveles arbitrariamente anidados.

El protocolo Mongo

Después de leer algunos de los comentarios, creo que vale la pena señalar que lo que realmente envía al servidor de Mongo no tiene nada que ver con el JavaScript que escribe en el shell de Mongo. El shell de Mongo utiliza SpiderMonkey con una serie de funciones y objetos predefinidos.

Pero en realidad no envía JavaScript al servidor Mongo, por lo que no puede enviar cosas como db.collection.find() . Más bien envías un binario OP_QUERY estructura con un nombre de colección codificado como cstring y una consulta codificada como BSON más un montón de banderas binarias. Ver:

El BSON es en sí mismo un formato binario con una cantidad de valores de bajo nivel definidos como bytes:

La conclusión es que no envía al servidor de Mongo nada parecido a lo que ingresa en el shell de Mongo. El shell de Mongo analiza las cosas que escribe utilizando el analizador SpiderMonkey y envía solicitudes binarias al servidor Mongo real. El shell de Mongo usa JavaScript, pero no se comunica con el servidor de Mongo en JavaScript.

Ejemplo

Incluso el objeto de consulta JSON no se envía a Mongo como JSON. Por ejemplo, cuando busca un documento con un hello propiedad igual a "mundo" usaría {hello: 'world'} en JavaScript o {"hello": "world"} en JSON, pero esto es lo que se envía al servidor de Mongo, por el shell de Mongo o por cualquier otro cliente de Mongo:

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

Por qué es tan diferente

Para comprender por qué la sintaxis utilizada en Node es tan diferente del shell de Mongo, consulte esta respuesta: