2016-10-01 210 views
1

我有一个用户模型和一个日志模型。日志模型是用户模型的子文档。所以在我的用户模型,我有:猫鼬 - 插入子文档

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

var UserSchema = new mongoose.Schema({ 
username: { 
    type: String, 
    unique: true 
}, 
logsHeld: [ 
    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'); 
      } 
     }); 
    }); 

但是,这是行不通的。它还包括一个'新用户'行,我不认为我需要这个用户是现有的

回答

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 duplicate key error index: testDB.users.$email_1 dup key:

你得到这个,因为有已经在文档拿起你的users集合在email字段中最可能具有null值。尽管您的架构没有明确指定email字段,但您可能在users.email上有一个现有的旧且未使用的唯一索引。

您可以

testDB.users.getIndexes() 

证实了这一点。如果是这样的话,并手动

testDB.users.dropIndex(<index_name_as_specified_above>) 

删除不需要的指标并进行与POST,看看是否已经纠正了错误,我敢打赌,我的0.02美元是您的users收藏中存在一个旧的未使用的唯一索引,这是主要问题。

+1

这样做了,谢谢! – MonkeyOnARock

0

尝试push在阵列中的猫鼬插入项

var user = new User; 
user.logssHeld.push({ 
    logComment: req.body.logComment 
}); 

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

看到的文档here

+0

刚刚尝试过;没有工作:( – MonkeyOnARock

+0

我更新的答案请看看 – abdulbarik

+0

不幸的是,这仍然是行不通的,它产生这个奇怪的错误:'TypeError:this._schema.caster.cast不是一个函数' – MonkeyOnARock

1

尝试使用logSchema它引用仅子文档模式,Log指../models/的全部内容日志

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

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

+1

感谢您的建议。这使得我的代码工作得更好*,因为在运行代码时nodejs不再关闭。但它仍然没有插入文件;我现在得到这个奇怪的重复错误:'WriteError({“code”:11000,“index”:0,“errmsg”:“E11000重复键错误索引:testDB.users。$ email_1 dup键:'etc ...这里说'电子邮件'是重复的,但没有提交电子邮件(用户的电子邮件是在此用户首次创建帐户时创建的)。 – MonkeyOnARock