将对象推送到数组属性后,mongoose对象无法正确保存

时间:2018-01-29 12:39:31

标签: mongoose mean-stack

我的用户架构包含一个notifications属性,它的值是一个对象数组(每个对象都是一个通知)

var UserSchema = new mongoose.Schema({
    //a bunch of other user properties.
    notifications: [{
        notification: String,
        directLink: String,
        notificationType: Number, //0=vote, 1=comment, 2= answer, 3=post from watched user, 4=watch
        onObject: { //not necessary if type (above) is 4
            type: String, //post, comment, answer
            id: String //id. but not as mongoose object because it is not necessary in this case.
        },
        date: {type: Date, default: Date.now, index: true},
        newNotification: {type: Boolean, default: true}
    }]
});

我的问题是当我尝试添加新通知时。当有人发布新内容,或有人回复你的评论等时,会调用一个名为newNotification的函数,并且要通知的用户将以post.author的形式作为参数传递给此函数(post是一个猫鼬对象将作者作为其属性之一,其值为用户的ObjectId,在传递给函数之前填充它。

在新通知函数内部,该对象已准备好,然后推送到user.notifications数组:

var newNot = {
            notification: notification,
            directLink: directLink,
            notificationType: action[0],
            onObject: on
        }
//this code is at the end of the function, newNot now contains the data for the new notification.
//the user is passed in as "notifyUser"
console.log(">>>>>>>>"+notifyUser);
console.log(">>>>>>>>>"+notifyUser.notifications);
notifyUser.notifications.push(newNot);                       
console.log(">>>>>>>>>>>"+notifyUser.notifications);
console.log(">>>>>>>>>>>>>>>"+notifyUser);
notifyUser.save();

问题是通知未保存。它工作正常,它作为通知添加到用户。默认情况下设置的属性甚至可以正确添加。但它没有保存 一般方法适用于另一个用户属性,它只是一个增加的数字,所以这不是问题。但我仍然试图为用户查询数据库然后在回调中运行这些东西,但仍然没有保存更改。我花了好几个小时试图弄清楚为什么它没有被妥善保存,但绝对没有。

注意:不,制作通知架构不是更好,在这种特定情况下,它是不必要的。

1 个答案:

答案 0 :(得分:0)

我发现了问题,由于我在架构中犯了一个错误,用户的更改未被保存,我心不在焉地使用了“#34; type"作为onObject对象的一个​​键。在这里:

onObject: {
        type: String, //post, comment, answer
        id: String //id. but not as mongoose object because it is not necessary in this case.
    }

这让mongoose认为onObject是一个字符串。事实上,我的意思是它是一个对象。将密钥类型重命名为其他东西可以解决问题。

onObject: { //not necessary if type (above) is 4
        objectType: String, //post, comment, answer
        id: String //id. but not as mongoose object because it is not necessary in this case.
    },

之前我无法找到问题,因为我没有发现错误,我更换了:

notifyUser.save();

失败了,但是:

notifyUser.save(function(err){
    if (err){
        console.log(err);
    }
});

(使用findByIdAndUpdate也无声地失败,而使用update和$ push发出了不明确的错误消息)。

我没有删除这个问题,因为如果有人遇到类似的问题,这可能会有所帮助