#node.js #mongodb #mongoose
#node.js #mongodb #мангуст
Вопрос:
У меня есть модель пользователя и модель журнала. Модель журнала является вложенным документом пользовательской модели. Итак, в моей пользовательской модели у меня есть:
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);
Таким образом, при создании «пользователя» поле «logshield» всегда начинается пустым. Я хочу знать, как добавить вложенные документы в эту пользовательскую модель.
Я пробовал использовать этот метод 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
вместо модели журнала в качестве схемы вложенного документа в 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]
});
Опираясь на ваши комментарии в другом ответе, где вы сталкиваетесь с другой проблемой
Ошибка записи ({«code»:11000,»index»:0,»errmsg»: «E11000 ошибка дублирующего ключа индекс ошибки: testDB.users.$email_1 дублирующий ключ:
вы получаете это, потому что в вашей коллекции уже есть документ users
, который, скорее null
всего, имеет значение в email
поле. Даже если в вашей схеме явно не указано email
поле, у вас может быть существующий старый и неиспользуемый уникальный индекс users.email
.
Вы можете подтвердить это с помощью
testDB.users.getIndexes()
Если это так, и вручную удалите ненужный индекс с помощью
testDB.users.dropIndex(<index_name_as_specified_above>)
и продолжайте публикацию, чтобы узнать, исправило ли это ошибку, я ставлю свои 0,02 доллара на то, что в вашей коллекции есть старый неиспользуемый уникальный индекс users
, который является основной проблемой.
Комментарии:
1. Это сделало это. Спасибо!
Ответ №2:
Попробуйте использовать logSchema
, который ссылается только на схему вложенного документа, Log
ссылается на все содержимое ../models/log
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 duplicate key error index: testDB.users.$email_1 dup key:
etc… Здесь говорится, что «электронная почта» дублируется, но электронное письмо не отправляется (электронное письмо для пользователя было создано, когда этот пользователь впервые создал свою учетную запись).
Ответ №3:
Попробуйте push
вставить элемент в массив в mongoose
var user = new User;
user.logssHeld.push({
logComment: req.body.logComment
});
user.save(function(err, doc) {
//DO whatever you want
});
смотрите документы здесь
Комментарии:
1. К сожалению, это все еще не работает; это приводит к этой странной ошибке:
TypeError: this._schema.caster.cast is not a function
2. мне не повезло, пожалуйста, посмотрите сейчас
3. Я думаю, у вас есть дополнительная фигурная скобка
{
на 4-й строке. Несмотря на это, я получаю ту же ошибку.4. пожалуйста, посмотрите документ