Мангуст — вставка вложенных документов

#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. пожалуйста, посмотрите документ