Question about MongoDB and NodeJS

1

I'm training MongoDB and NodeJS, although I have some doubts. In my APP file I defined the following

Here I put my code (do not pay attention to the XD notes)

//esta variable almacena las funciones del paquete express, el cuál es el núcleo del framework
var express = require('express');

//esta variable almacena las funciones de la variable express, el cual le da vida a la página
var app = express();

//esta variable almacena las funciones del paquete mongoose el cual sirve para conectarse con MongoDB
var mongoose = require('mongoose');

//esta variable almacena las funciones del paquete body-parser, el cual sirve para traducir las peticiones en json
var bodyParser = require('body-parser');

//esta variable almacena las funciones del paquete cloudinary, el cual sirve para subir imagenes a la web
var cloudinary = require('cloudinary');

//esta variable almacena las funciones del paquete multer, el cual sirve para hacer más legibles de código las imágenes
var multer = require('multer');

//Se realiza la configuración de cloudinary con nuestra cuenta
cloudinary.config(
{
        cloud_name:"***",
        api_key:"***",
        api_secret:"***"
});

//Aquí le decimos que se conecte a mongo, la ruta por defecto es esta.
mongoose.connect('mongodb://localhost/myPage');

//Aquí le indicamos a app que use las funciones de bodyParser.
app.use(bodyParser.json());

//Aquí le indicamos que desencripte la información enviada por POST o GET
app.use(bodyParser.urlencoded({extended: true}));

//Aqui mencionamos que habrá una carpeta de archivos estaticos.
app.use(express.static("public"));

//Le indicamos a Express que use a multer con los parámetros, de donde se subiran las imágenes y su será una sola, un array o ocualquiera.
app.use(multer({dest: "./uploads"}).single('image_avatar'));

//se creará un nuevo esquema de productos, es decir, el esqueleto del documento JSON
var productosSchema =
{
    title:String,
    desc:String,
    imageUrl:String,
    price:Number
};

//Creamos una nueva variable la cual
var Product = mongoose.model("Product", productosSchema);

//se indica a la aplicación que jade será será el motor de vistas
app.set("view engine", "jade");

/*get es el método HTTP, también se usa POST pero eso es usado cuando
se hacen envíos de formulario. El primer parámetro es conocer a cuál
URL esta haciendo la petición, en este caso es la raíz. El segundo
es la respuesta del servidor*/
app.get("/", function(req,res)
{
    //se renderiza el index, el cual es el jade en views
    res.render('index');
});

//renderiza el archivo new.jade y nos dá la descripción del body enviado
app.post("/menu", function(req,res)
{

    //Aquí se crean los datos para la DB respetando el esqueleto que se definió arriba
    //la información la sacamos del request y después de body y luego de cada campo
    var data =
    {
        title : req.body.name,
        desc : req.body.desc,
        imageUrl : "",
        price : req.body.price
    }

    //se crea una nueva variable y se estancia del modelo definido arriba y se envían los datos.
    var product = new Product(data);

    //se usa la sentencia de claudinary para subir las fotos.
    cloudinary.uploader.upload(req.file.path,
    function(result)
    {
        //antes de guardar el JSON en MongoDB, le decimos que la url viene del result
        product.imageUrl = result.url;
        product.save(function(err)
        {
            console.log(result);
            console.log(product);
            res.render("menu/new");
        });
    });
});
//Se salva la información y se manda un mensaje a la consola.


//Renderiza el archivo new.jade
app.get("/menu/new",function(req,res)
{
    res.render("menu/new");
});

app.get("/menu",function(req,res)
{
    Product.find(function(error,document)
    {
        if(error)
        {
            console.log(error);
        }

        else
        {
            res.render("menu/index",{productos : document})
        }
    });
});

//Aquí se define cual es el puerto de escucha.
port = 3000;
app.listen(port);
console.log("Servidor corriendo en el puerto " + port);

My question is, when I put data into Mongo, it was great, although I did not have that "Product" Collection, I created a collection called products, which I did not define in any part of the code as a new collection. That confuses me a lot, can someone help me tell me how that works?

Also, when I want to bring the Mongo data, I have to use the Product.find() statement because if I use it as products.find() , it marks me an error. What I mean is that, I'm not supposed to do the queries as I would write it in Mongo?

    
asked by Alberto Siurob 01.08.2016 в 02:13
source

2 answers

2

The Mongodb drivers of the different languages, are concerned with the creation of the collection in the case that it does not exist. That is why when you connected, the driver searched for your collection and when he did not find it, he created it transparently.

Regarding the find method, this is relative to the mongoose API. When doing

var Product = mongoose.model("Product", productosSchema);

you create a class Product which has static methods, which make calls to mongo. If you did products.find you would be calling the method find of an array of products.

    
answered by 01.08.2016 / 13:54
source
0

An example of a search with mongoose, first I leave you the json structure of the collection: {Yo hice', attribs: { name: 'name', categories: 'category', details: 'details' }}

products.find({attribs: {$elemMatch: {categoria : "bebidas"}}}, function (err, products){

}
    
answered by 27.09.2016 в 13:22