node.js - 猫鼬中的多个填充不起作用
问题描述
我有这样的架构:
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
解决方案
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 })...
推荐阅读
- jupyter-notebook - 在 Jupyter 中使用 SlickGrid Select2
- python - UnknownError:找不到 dnn 实现
- java - How do I make so I can increase and decrease volume of a sound playing
- asp.net-core - 如何通过标签助手将模型元数据传递给局部视图?
- azure - Web 应用程序的 Azure 合规性
- batch-file - 将源文件批量复制到某些子目录,副本名称基于其中的文件?
- node.js - 未找到 Firestore 集合组查询 doc.data()
- woocommerce - Woocommerce 中的 hide_empty 类别不起作用
- android - 使用不支持多语言环境的 travis 构建应用程序(语言)
- javascript - JavaScript:对等连接上的黑屏