【问题标题】:Multiple Populate in mongoose not working猫鼬中的多个填充不起作用
【发布时间】:2019-09-04 15:47:13
【问题描述】:

我有这样的架构:

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

const AcceptedMessageSchema = 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' } });

AcceptedMessageSchema.plugin(deepPopulate);
module.exports = mongoose.model('Accepted', AcceptedMessageSchema);

当我接受来自其他用户的消息/邮件时,我将其保存到acceptedMessageSchema,这样当其他用户登录时,他可以看到我已经接受了他的消息。

同样,我想跟踪我接受了多少条消息,所以我尝试了这个:

const router = require('express').Router();
const checkJWT = require('../../middlewares/check-jwt');
const AcceptedMessageSchema = require('../../models/mailbox/accepted-messages');

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

router.post('/acceptMessage', checkJWT, (req, res, next) => {
  console.log('accept');
  const accept = new AcceptedMessageSchema();
  accept.body = req.decoded.user.name + ' has accepted your message';
  accept.recipient = req.decoded.user._id;
  accept.sender = req.body.id;
  AcceptedMessageSchema.find({ sender: req.body.id }).lean().exec(function (err, senders) {
    const messageFound = senders.some((obj) => {
      return JSON.stringify(obj.recipient) === JSON.stringify(req.decoded.user['_id']);
    });
    if (!messageFound) {
      accept.save().then(messageSaved => {
        res.json({
          success: true,
          message: "Accepted!"
        });
      }).catch(error => {
        next(error);
        res.json({
          success: false,
          message: "Couldn't send message"
        });
      });
    } else {
      res.json({
        success: false,
        message: 'Message already accepted!'
      });
    }
  });
});

module.exports = router;

但它返回一个空数组。

数据库中的数据:

{
    "_id": {
        "$oid": "5d6fd251263b282ac0f7860d"
    },
    "updatedAt": {
        "$date": "2019-09-04T15:03:45.842Z"
    },
    "created_at": {
        "$date": "2019-09-04T15:03:45.842Z"
    },
    "sender": {
        "$oid": "5d6b06eca4b60b09b3c376e1"
    },
    "recipient": {
        "$oid": "5d6b0718a4b60b09b3c376e2"
    },
    "body": "John has accepted your message",
    "__v": 0
}

所以这里发件人5d6b06eca4b60b09b3c376e1 已将消息发送给收件人5d6b0718a4b60b09b3c376e2

【问题讨论】:

  • 在mongodb终端执行find查询会发生什么,你收到记录了吗?如果是,那么您可以尝试在查找查询中将请求转换为 ObjectId。我不确定它是否会对您有所帮助,但值得一试。

标签: node.js mongodb mongoose


【解决方案1】:

Model.find() 的第二个参数是投影,所以看起来您的查询 AcceptedMessageSchema.find({ recipient: req.decoded.user._id, }, { sender: req.decoded.user._id }) 是错误的。应该是:

AcceptedMessageSchema.find({ recipient: req.decoded.user._id, sender: req.decoded.user._id })...

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 2016-12-24
    • 2018-06-10
    • 2013-06-20
    • 1970-01-01
    • 2014-05-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多