Search code examples
mongodbmongoosemongoose-populate

Mongoose Populate not returning related data


I have the following Models:

const mongoose = require('mongoose');
mongoose.Promise = global.Promise;

const imputerSchema = new mongoose.Schema({
  dninie: {
    type: String,
    trim: true,
  },
  name: {
    type: String,
    trim: true,
    required: true,
  },
  lastname: {
    type: String,
    trim: true,
    required: true,
  },
  second_lastname: {
    type: String,
    trim: true,
  },
  phone : {
    type: Number,
    unique: true,
    trim: true,
  },
  qr: {
    type : String,
    unique: true,
    default: Date.now
  }
});

module.exports = mongoose.model('Imputer', imputerSchema)

const mongoose = require('mongoose');
mongoose.Promise = global.Promise;

const imputationSchema = new mongoose.Schema({
  qr: {
    type: String,
    trim: true,
    required: true,
    ref: 'Imputer',
  },
  imputation_date: {
    type: String,
    default: Date.now,
    required: true,
  },
  coordinates: {
    type: [Number, Number],
    index: '2d',
  },
});

module.exports = mongoose.model('Imputation', imputationSchema);

and I trying to make a query like this:

Imputation.find()
        .populate('imputer.qr')
        .exec()
        .then(docs => console.log(docs));

I also try

   Imputation.find()
            .populate('imputer')
            .exec()
            .then(docs => console.log(docs));

But I'm only got the documents on the imputation model without the field on the imputers model.

Here are some screenshots of how the documents lookenter image description here enter image description here


Solution

  • Change your imputationSchema as follows:

    const imputationSchema = new mongoose.Schema({
      qr: {
        type: mongoose.Types.ObjectId, ref: "Imputer",
        trim: true,
        required: true,
       },
    // other fields...
    });
    

    and then query like this:

    Imputation.find()
                .populate('qr')
                .exec()
                .then(docs => console.log(docs));