Geraint
Geraint

Reputation: 3407

Model not returning what is expected

I have 2 mongoose Models/Schemas (Products & Merchants). When doing a .find() on Products it is returning all products, as expected but when doing it for Merchants it is returning everything (both merchant and product data) when it should just be returning merchants based off the defined schema. I have one collection on my mongoDB server which contains all my merchants and the products.

Any idea what I am missing?

Thanks

Merchants Model

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var MerchantShema = new Schema({
  merchants: [{
    merchant_id: Number,
    price_current: Number,
    price_rrp: Number,
    aff_link: String,
    merchant_product_id: Number,
    aw_image_url: String,
    cost_scoop: String,
    created_at: Date,
    updated_at: Date
  }]
});

module.exports = mongoose.model('Merchants', MerchantShema, 'products');

Products Model

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ProductSchema = new Schema({
  ean: Number,
  aw_product_id: Number,
  product_name: String,
  product_brand: String,
  product_description: String,
  img_sml: String,
  img_lrg: String,
  cat: String,
  sub_cat: String,
  weight: String,
  rating: String,
  created_at: Date,
  updated_at: Date,
  merchants: [{
    merchant_id: Number,
    price_current: Number,
    price_rrp: Number,
    aff_link: String,
    merchant_product_id: Number,
    aw_image_url: String,
    cost_scoop: String,
    created_at: Date,
    updated_at: Date
  }],
  nutrition: [{
    calories: Number,
    protein: Number,
    fat: Number,
    sat_fat: Number,
    carbs: Number,
    sugar: Number,
    salt: Number,
    calories: Number
  }],
  ingredients: String,
  flavours: String,
  is_active: Boolean
});

module.exports = mongoose.model('Products', ProductSchema, 'products');

My Routes

  app.get('/api/products', function(req, res) {
    Products.find(function(err, products){
        if (err) return console.error(err);
        return res.send(products);
    })
    .where('is_active').equals('true')
  });

  app.get('/api/merchants', function(req, res){
    Merchants.find(function(err, merchants){
      if (err) return console.error(err);
      return res.send(merchants);
    });
  });

Example of my collection

[
    {
        "_id": "55840f86e4b0ba19c15ee26d",
        "merchant_id": "1111",
        "merchant_aw_id": "1",
        "merchant_name": "test merchant",
        "merchant_url": "google.com",
        "merchant_image": "",
        "created_at": "",
        "updated_at": "",
        "merchants": []
    },
    {
        "_id": "558426f9e4b0ba19c15ee495",
        "ean": "123456789",
        "aw_product_id": "55555",
        "product_name": "Test Product",
        "product_brand": "Test Brand",
        "product_description": "This is a description for the test product",
        "img_sml": "http://images.productserve.com/preview/6/3196/73/20/704322073.jpg",
        "img_lrg": "http://images.productserve.com/preview/6/3196/73/20/704322073.jpg",
        "cat": "Protein",
        "sub_cat": "Protein",
        "weight": "2.5kg",
        "rating": "5",
        "created_at": "",
        "updated_at": "",
        "nutrition": [
            {
                "salt": "1",
                "sugar": "1",
                "carbs": "1",
                "sat_fat": "1",
                "fat": "1",
                "protein": "1",
                "calories": "1"
            }
        ],
        "ingredients": "",
        "flavours": "",
        "is_active": "true",
        "merchants": [
            {
                "merchant_id": 1111,
                "price_current": 9.99,
                "price_rrp": 15.99,
                "aff_link": "google.com",
                "merchant_product_id": 999,
                "aw_image_url": "",
                "cost_scoop": "43p",
                "created_at": "",
                "updated_at": ""
            }
        ]
    },
    {
        "ean": "123456789",
        "aw_product_id": "55555",
        "product_name": "Test Product",
        "product_brand": "Test Brand",
        "product_description": "This is a description for the test product",
        "img_sml": "http://images.productserve.com/preview/6/3196/73/20/704322073.jpg",
        "img_lrg": "http://images.productserve.com/preview/6/3196/73/20/704322073.jpg",
        "cat": "Protein",
        "sub_cat": "Protein",
        "weight": "2.5kg",
        "created_at": "",
        "updated_at": "",
        "nutrition": [
            {
                "salt": "1",
                "sugar": "1",
                "carbs": "1",
                "sat_fat": "1",
                "fat": "1",
                "protein": "1",
                "calories": "1"
            }
        ],
        "ingredients": "",
        "flavours": "",
        "is_active": "true",
        "merchants": [
            {
                "merchant_id": 1111,
                "price_current": 9.99,
                "price_rrp": 15.99,
                "aff_link": "google.com",
                "merchant_product_id": 999,
                "aw_image_url": "",
                "cost_scoop": "43p",
                "rating": "5",
                "created_at": "",
                "updated_at": ""
            }
        ]
    }
]

Upvotes: 1

Views: 62

Answers (1)

Eric Hartmann
Eric Hartmann

Reputation: 776

In looking at your merchants model definition. You are calling products in your export:

module.exports = mongoose.model('Merchants', MerchantShema, 'products');

This should probably read

module.exports = mongoose.model('Merchants', MerchantShema, 'merchants');

Another thing I noticed is that you have two keys called "calories".

I ran the code and it now brings back merchants correctly. However, when you call products, it brings back the merchant as part of that schema, since merchants are included in products. Another way you can do this is to use a nested schema. You can read about those in this other thread: Mongoose subdocuments vs nested schema

Hope that helps.

Upvotes: 1

Related Questions