wuku
wuku

Reputation: 163

One to one with populate mongoose not working

I'm new to mongoose and mongodb. I have two collection (cart and produk)

1 cart have 1 produk, and I get the cart and populate the product but is not show the data relations. Here the code:

routing

router.route('/relations/:app_id')
.get(cartController.relation);

model (cartModel)

var mongoose = require('mongoose');
var cartSchema = mongoose.Schema({
    app_id: {
        type: String,
        required: true
    },
    product_id: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Produk'
    },
    qty: Number
});

var collectionName = 'cart';
var Cart = module.exports = mongoose.model('Cart', cartSchema, collectionName);

module.exports.get = function (callback, limit) {
    Cart.find(callback).limit(limit);
}

model (produkModel)

var mongoose = require('mongoose');

// Setup schema
var produkSchema = new Schema({
    name: {
        type: String,
        required: true
    },
    stok: Number
});

// Export Cart model
var collectionName = 'produk';
var Produk = module.exports = mongoose.model('Produk', produkSchema, collectionName);

module.exports.get = function (callback, limit) {
    Produk.find(callback).limit(limit);
}

controller (cartController)

Cart = require('../model/cartModel');
exports.relation = function (req, res) {
const showCart = async function() {
    const carto = await Cart.find().select('app_id product_id qty').populate("produk");

    return carto;
};

showCart()
  .then(cs => {
    return apiResponse.successResponseWithData(res, "Operation success", cs);
  })
  .catch(err => console.log(err));

};

// Result

{
"status": 1,
"message": "Operation success",
"data": [
    {
        "_id": "60af72022d57d542a41ffa5a",
        "app_id": "CvR4dTTjC7qgr7gA2yoUnIJnjRXaYokD6uc2pkrp",
        "qty": 1,
        "product_id": "60112f3a25e6ba2369424ea3"
    },
    {
        "_id": "60b020536ccea245b410fb38",
        "app_id": "CvR4dTTjC7qgr7gA2yoUnIJnjRXaYokD6uc2pkrp",
        "product_id": "603f5aff9437e12fe71e6d41",
        "qty": 1
    }
]
}

expecting result

{
"status": 1,
"message": "Operation success",
"data": [
    {
        "_id": "60af72022d57d542a41ffa5a",
        "app_id": "CvR4dTTjC7qgr7gA2yoUnIJnjRXaYokD6uc2pkrp",
        "qty": 1,
        "product_id": {
             "_id": "60112f3a25e6ba2369424ea3",
             "name": "snack"
         }
    },
    {
        "_id": "60b020536ccea245b410fb38",
        "app_id": "CvR4dTTjC7qgr7gA2yoUnIJnjRXaYokD6uc2pkrp",
        "product_id": {
             "_id": "603f5aff9437e12fe71e6d41",
             "name": "snack"
         }
        "qty": 1
    }
]
}

what I miss ???

Thanks for your help

Upvotes: 0

Views: 228

Answers (1)

Cuong Le Ngoc
Cuong Le Ngoc

Reputation: 11975

You need to pass the path to populate or an object specifying parameters to .populate(). So in this case, Your code should be:

const carto = await Cart.find().select('app_id product_id qty').populate("product_id");

Upvotes: 1

Related Questions