Mongoose - 插入子文档

时间:2016-10-01 08:14:43

标签: node.js mongodb mongoose

我有一个用户模型和一个日志模型。日志模型是用户模型的子文档。所以在我的用户模型中我有:

var mongoose = require('mongoose');
var Log = require('../models/log');

var UserSchema = new mongoose.Schema({
username: {
    type: String,
    unique: true
},
logsHeld: [
    Log
]
});

然后在我的' Log'模特我:

var mongoose = require('mongoose');
var logSchema = new mongoose.Schema({
    logComment: {
        type: String,
    },
});

module.exports = mongoose.model('Log', logSchema);

因此,在创建'用户'时,' logsHeld'永远是空的。我想知道如何将子文档添加到此用户模型。

我尝试过这种POST方法:

router.post('/createNewLog', function(req, res) {
    var user = new User ({
            logssHeld: [{
                logComment: req.body.logComment
            }]
        });
            user.save(function(err) {
                if(err) {
                req.flash('error', 'Log was not added due to error');
                return res.redirect('/home');
            } else {
                req.flash('success', 'Log was successfully added!');
                return res.redirect('/home');
            }
        });
    });

但这不起作用。它还包括一个新用户'线路,我认为我不需要,因为这将是现有的用户。

3 个答案:

答案 0 :(得分:1)

尝试使用仅引用子文档架构的logSchemaLog引用../ models / log

的全部内容
var UserSchema = new mongoose.Schema({
    username: {
        type: String,
        unique: true
    },
    logsHeld: [
        logSchema
    ]
});

文档:http://mongoosejs.com/docs/subdocs.html

答案 1 :(得分:1)

您需要使用logSchema而不是Log模型作为User模型中的子文档架构。您可以按如下方式访问架构:

var mongoose = require('mongoose');
/* access the Log schema via its Model.schema property */
var LogSchema = require('../models/log').schema; // <-- access the schema with this 

var UserSchema = new mongoose.Schema({
    username: {
        type: String,
        unique: true
    },
    logsHeld: [LogSchema]
});

在您面临另一个问题的另一个答案中提取您的评论

  

WriteError({“code”:11000,“index”:0,“errmsg”:“E11000重复键   错误索引:testDB.users。$ email_1 dup key:

您收到此消息是因为users集合中已有一个文档,其null字段的值很可能为email。即使您的架构未明确指定email字段,您也可能在users.email上拥有旧的和未使用的唯一索引。

您可以使用

确认
testDB.users.getIndexes() 

如果是这种情况,请使用

手动删除不需要的索引
testDB.users.dropIndex(<index_name_as_specified_above>)

并继续使用POST来查看是否已纠正错误,我打赌我的0.02美元,users集合中有一个旧的未使用的唯一索引,这是主要问题。

答案 2 :(得分:0)

尝试push在mongoose

中插入数组中的项目
var user = new User;
 user.logssHeld.push({
    logComment: req.body.logComment
});

user.save(function(err, doc) {
    //DO whatever you want
});

查看文档here