在猫鼬中查询时如何获取引用对象

时间:2019-09-02 17:04:17

标签: node.js mongoose

我有一个模式:

const mongoose = require('mongoose');
const deepPopulate = require('mongoose-deep-populate')(mongoose);
const Schema = mongoose.Schema;

const MessageSchema = new Schema({
  body: String,
  seen: Boolean,
  sender: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User"
  },
  recipient: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User"
  }
}, { timestamps: { createdAt: 'created_at' } });

MessageSchema.plugin(deepPopulate);
module.exports = mongoose.model('Message', MessageSchema);

查询:

router.get('/getSentMessages', checkJWT, (req, res, next) => {

      Messages.find({ sender: req.decoded.user._id }).populate('User').exec(function (err, messages) {
        console.log('getSentMessages ', messages);
        res.json({
          success: true,
          messages: messages,
          message: "Successful"
        });
      });

我正在输出中填充ref用户:

getSentMessages  [
  model {
    '$__': InternalCache {
      strictMode: true,
      selected: {},
      shardval: undefined,
      saveError: undefined,
      validationError: undefined,
      adhocPaths: undefined,
      removing: undefined,
      inserting: undefined,
      version: undefined,
      getters: {},
      _id: 5d6bebd30a78a52ebf5ed574,
      populate: undefined,
      populated: [Object],
      wasPopulated: false,
      scope: undefined,
      activePaths: [StateMachine],
      pathsToScopes: {},
      ownerDocument: undefined,
      fullPath: undefined,
      emitter: [EventEmitter],
      '$options': true
    },
    isNew: false,
    errors: undefined,
    _doc: {
      __v: 0,
      body: 'Your profile',
      sender: 5d6b06eca4b60b09b3c376e1,
      recipient: [model],
      created_at: 2019-09-01T16:03:31.892Z,
      updatedAt: 2019-09-01T16:03:31.892Z,
      _id: 5d6bebd30a78a52ebf5ed574
    },
    '$init': true
  }
]

出了什么问题我无法弄清楚?

2 个答案:

答案 0 :(得分:1)

您需要在要填充的字段上致电populate

router.get('/getSentMessages', checkJWT, (req, res, next) => {
  Messages.find({ sender: req.decoded.user._id })
    .populate('sender')
    .populate('recipient')
    .exec(function (err, messages) {
      console.log('getSentMessages ', messages);
      res.json({
        success: true,
        messages: messages,
        message: "Successful"
      });
  });
});

答案 1 :(得分:0)

字符串化并分析结果。像JSON.parse(JSON.stringify(messages))

router.get('/getSentMessages', checkJWT, (req, res, next) => {
    Messages.find({ sender: req.decoded.user._id }).populate('User').exec(function (err, messages) {
        console.log('getSentMessages ', JSON.parse(JSON.stringify(messages))); // here
        res.json({
            success: true,
            messages: messages,
            message: "Successful"
        });
    });
}