Express JS - 无法将数组推送到MongoDB中的表

时间:2018-04-10 21:29:56

标签: javascript node.js mongodb mongoose

我的MongoDB数据库中有两个表。

1)用户 2)消息

在我的应用程序中,当用户创建“消息”时,我试图将messages作为数组插入User表。

为用户和消息定义的模式如下所示

消息方案

var schema = new Schema({
content: {type: String, required: true},
user: {type: Schema.Types.ObjectId, ref: 'User'}
});

用户架构

var schema = new Schema({
    firstName: {type: String, required: true},
    lastName: {type: String, required: true},
    password: {type: String, required: true},
    email: {type: String, required: true, unique: true},
    messages: [{type: Schema.Types.ObjectId, ref: 'Message'}]
});

我有一个post方法定义如下:

router.post('/', function (req, res, next) {
var decoded = jwt.decode(req.query.token);
User.findById(decoded.user._id, function (err, user) {
    if (err) {
        return res.status(500).json({
            title: 'An error occurred',
            error: err
        });
    }
    var message = new Message({
        content: req.body.content,
        user: user._id
    });
    console.log("Message:"+ message);
    message.save(function (err, result) {
        if (err) {
            return res.status(500).json({
                title: 'An error occurred',
                error: err
            });
        }
        user.messages.push(result);
        user.save();
        console.log('Saved...'+user);

        res.status(201).json({
            message: 'Saved message',
            obj: result
        });
    });
  });
});

这里我首先检查用户是否存在,然后将带有userid引用的消息发送到“Message”表中,并尝试通过将Message推入列类型来在user表中创建相应的条目接受消息作为数组。

在运行应用程序时,在我的控制台中,我可以看到附加到用户集合的消息对象,如下所示:

enter image description here

但是当我检查我的数据库以查看该消息是否已附加时,它会将消息数组显示为null:

enter image description here

不确定在将数组附加到集合时我出错了。

2 个答案:

答案 0 :(得分:1)

做一个小改动:

message.save(function (err, result) {
        // ... your other code 

        user.messages.push(result.id || result._id); // CHANGE THIS LINE
        user.save();
        console.log('Saved...'+user);

        res.status(201).json({
            message: 'Saved message',
            obj: result
        });

    });

答案 1 :(得分:0)

我终于通过更新User集合的Schema来实现它。

我更新的架构是 -

var schema = new Schema({
firstName: {type: String, required: true},
lastName: {type: String, required: true},
password: {type: String, required: true},
email: {type: String, required: true, unique: true},
messages: [{type: Schema.Types.ObjectId, ref: 'Message'}]

},

{ usePushEach: true }, // ADDED THIS
);

参考:

https://github.com/Automattic/mongoose/issues/5574#issuecomment-332290518 https://github.com/Automattic/mongoose/issues/5924