Javascript MongoDB和Mongoose-来自两个不同集合查询的id不匹配
我正在开发一个应用程序,人们可以在其中制作便餐,并邀请其他用户参加他们的便餐。我有一个看似简单的问题,但我一直无法解决: 我想制作一个邀请路线,检查potluck.attenders,查看他们是否曾被邀请(如果他们之前被邀请且其状态为2拒绝,则发送不同的错误,具体取决于他们是0待决、1待决还是重新邀请),如果没有,将被邀请者放入potluck.attendes对象数组,并将potluck的_id放入被邀请者的user.potlucks对象数组 以下是这两个模型的超级修剪版本: 简化的便餐模式Javascript MongoDB和Mongoose-来自两个不同集合查询的id不匹配,javascript,mongodb,express,mongoose,collections,Javascript,Mongodb,Express,Mongoose,Collections,我正在开发一个应用程序,人们可以在其中制作便餐,并邀请其他用户参加他们的便餐。我有一个看似简单的问题,但我一直无法解决: 我想制作一个邀请路线,检查potluck.attenders,查看他们是否曾被邀请(如果他们之前被邀请且其状态为2拒绝,则发送不同的错误,具体取决于他们是0待决、1待决还是重新邀请),如果没有,将被邀请者放入potluck.attendes对象数组,并将potluck的_id放入被邀请者的user.potlucks对象数组 以下是这两个模型的超级修剪版本: 简化的便餐模式 c
const PotluckSchema = new Schema({
attendees: [
{
attendeeId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
status: Number,
enums: [
0, //'pending',
1, //'attending',
2 //'declined'
]
}
]
});
const UserSchema = new Schema({
potlucks: [
{
potluck: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Potluck'
}
}
]
});
简化用户模型
const PotluckSchema = new Schema({
attendees: [
{
attendeeId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
status: Number,
enums: [
0, //'pending',
1, //'attending',
2 //'declined'
]
}
]
});
const UserSchema = new Schema({
potlucks: [
{
potluck: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Potluck'
}
}
]
});
到目前为止,我在这条路线上得到的是:
router.put('/attendees/invite/:potluckId/:inviteeId', async (req, res) => {
try {
const currPotluck = await db.Potluck.findOne({
_id: req.params.potluckId,
createdBy: req.user._id
});
// Makes sure potluck belongs to user before allowing to invite
if (!currPotluck)
return res.status(401).json({
msg: 'You are not authorized to invite people to this potluck.'
});
const invitee = await db.User.findOne({ _id: req.params.inviteeId });
console.log(currPotluck);
console.log(invitee);
for (let i = 0; i < currPotluck.attendees.length; i++) {
// Checks if invitee already exists in potluck.attendees
// and if their status is 0 or 1 (pending or attending)
// It will stop function
if (
currPotluck.attendees[i].attendeeId == invitee._id &&
currPotluck.attendees[i].status == 0 ||
currPotluck.attendees[i].attendeeId == invitee._id &&
currPotluck.attendees[i].status == 1
) {
return res.status(401).send({
error: 'This member has already been invited to your potluck'
});
} else if (
currPotluck.attendees[i].attendeeId == invitee._id &&
currPotluck.attendees[i].status == 2
) {
// if their status is 2 (declined)
// it will edit their existing object in the attendees array to pending
// and re-insert potluck in invitee's user.potlucks model
await db.Potluck.findOneAndUpdate(
{ _id: currPotluck._id },
{ $set: { 'attendees.$[el].status': 0 } },
{ arrayFilters: [{ 'el.attendeeId': invitee._id }] }
);
await db.User.findOneAndUpdate(
{ _id: invitee._id },
{ $push: { potlucks: { potluck: currPotluck._id } } }
);
res.send(`This user has been re-invited to your potluck!`);
}
}
// If they don't exist already in potluck.attendees, create new object
// in potlucks.attendees and user.potlucks for invitee
await db.Potluck.findOneAndUpdate(
{ _id: currPotluck._id },
{ $push: { attendees: { attendeeId: invitee._id, status: 0 } } }
);
await db.User.findOneAndUpdate(
{ _id: invitee._id },
{ $push: { potlucks: { potluck: currPotluck._id } } }
);
res.send(`This user has been invited to your potluck!`);
} catch (err) {
console.error(err.message);
res.status(500).send('Server Error');
}
});
router.put('/attendes/invite/:potluckId/:inviteeId',异步(req,res)=>{
试一试{
const currPotluck=等待db.Potluck.findOne({
_id:req.params.potluckId,
createdBy:req.user.\u id
});
//在允许邀请之前,确保聚餐属于用户
如果(!家常便饭)
返回res.status(401).json({
味精:“您无权邀请他人参加此聚餐。”
});
const invitee=wait db.User.findOne({u id:req.params.inviteeId});
控制台日志(currPotluck);
console.log(被邀请者);
for(设i=0;i
现在开始讨论问题:
如果我在postman中运行此代码,它将运行for循环后面的两个'findOneAndUpdate',无论是否存在匹配。尝试调试时,我console.logged同时记录了invitee.\u id
和currPotluck.Attendes[I].attendeeId
(对于我知道数组中已经存在被邀请者的测试),并且它们都显示为相同的id
但是如果我尝试console.log(currPootluck.attendes[I].attendeeId==invitee.\u id)
每次都会出现false
。我对两者都做了一个“类型”,它们都作为对象出现,它们在console.logs中似乎都是相同的类型-可能是字符串
我知道解决方案一定非常简单,但我想不出来,任何帮助都将不胜感激 两个
currPootluck.attendes[i].attendeeId
和invitee.\u id
都是objectID
,为了检查它们是否相同,必须首先将其转换为字符串
这应该可以完成任务:
currPootluck.attendes[i].attendeeId.toString()==invitee.\u id.toString()
看一看谢谢!我不知道如何正确地表达这个问题,因为我一直在寻找答案:)