Как обновлять модели, связанные перед тем, как обновлять модель в mongooose?

Как возможно связывать модель базы данных в mongodb используя mongoose? А именно, я буду создавать книгу, перемещу его всю необходимую стоимость, имя, и т.д., но захочу знать, как я делаю, если после того, как сохраняю книгу, я также хочу, чтобы была введена информация о книге, например id или титул. Это две схемы:

var autor = new Schema({  
    nombre: String,
    biografia: String,
    fecha_de_nacimiento: Date,
    nacionalidad: String
    books: [{
    libro: {
      titulo: String,
      ref: 'libro'
    },
    funciones: String
  }],
});

var libro = new Schema({  
    titulo: String    
    paginas: Number,
    isbn: String,
    autor: { type: Schema.ObjectId, ref: "Autor" } 
});

Чтобы создавать книгу он сделал бы нечто похожее:

var libro = new libro({
    titulo: req.body.titulo,
    paginas: req.body.paginas,
    isbn: req.body.isbn,
});

libro.save(function(err, tvshow) {
    if(err) return res.status(500).send( err.message);
    res.status(200).json(libro);
});

Но: как я ввожу информацию, например id и титул книги в модели автора?

0
задан 24.03.2016, 19:52
1 ответ

То, что ты пробуешь создать, является связью одного во многие, у книги есть автор и у автора есть много книг (ты был бы должен моделировать этому для того, чтобы у него мог быть больше одного, со многих до многих).

Выражать связь в книге - легко только использует один Schema.ObjectId и используй ref чтобы показывать его в mongoose каков это модель, которую он должен использовать

var libroSchema = new Schema({  
    titulo: String    
    paginas: Number,
    isbn: String,
    autor: { type: Schema.ObjectId, ref: "Autor" } 
});

Для автора ты нуждаешься в договоренности, так как это может быть 0 или более элементов.

Позволь creacción договоренностей SchemaTypes или Sub-Documents.

// Ejemplo usando un subdocumento
var autorSchema = new Schema({  
    nombre: String,
    biografia: String,
    fecha_de_nacimiento: Date,
    nacionalidad: String
    libros: [libroSchema]
});

Чтобы обновлять этот это пример

var autor = new Autor({nombre: 'Miguel de Cervantes', libros: [ {titulo: 'El ingenioso hidalgo don Quijote de la Mancha'}, {titulo: 'La Galatea'}]});
autor.save(/*...Manejo de errores...*/);

Проблема использования субдокумента состоит в том, что эти только обновлены, когда документ отец обновлен тем, что только является хорошим решением, если ты хочешь поддержать их как независимые данные внутри других документов, не как связанные данные.

Правильный способ выражать эти связи состоит в том, чтобы использовать простые ссылки и призывать в метод populate, когда ты захочешь получить все данные.

Не существуют joins в MongoDB, но иногда даже хотят снабдить ссылками документы в других коллекциях. В этом случаи он когда population он используется.

Это - то, что знает в других frameworks, как гидратирование.

// Ejemplo usando populate y ObjectId
var autorSchema = new Schema({  
    nombre: String,
    biografia: String,
    fecha_de_nacimiento: Date,
    nacionalidad: String
    libros: [{type: Schema.ObjectId, ref: "Libro"}]
});

и потом чтобы получать объект автор со всеми Вашими связанными данными

var Autor = mongoose.model('Autor', autorSchema)

Autor
    .findOne({ nombre: 'Miguel de Cervantes'})
    .populate('libros')
    .exec(function (err, autor) {
        if (err) return handleError(err);
        // la variable autor contiene los datos del autor y sus libros escritos
     });

Чтобы обновлять книги одинокого автора ты нуждаешься Ваш _id. Следуя примеру предыдущий

var quijote = new Libro({titulo: 'El ingenioso hidalgo don Quijote de la Mancha'});
var galatea = new Libro({titulo: 'La Galatea'});
quijote.save(/*... manejo de errores..*/);
galatea.save(/*... manejo de errores..*/);


.exec(function (err, autor) {
    if (err) return handleError(err);
    autor.libros = [quijote._id, galatea._id];
    autor.save(function(err) {
        // se actualizaron los datos del autor
    });
});

Имей в виду, что, чтобы создавать Модели, ты должен использовать прописные буквы для того, чтобы они отличились ясно поэтому, я добавил суффикс Schema под мои переменные (libroSchema и autorSchema) для того, чтобы они не запутались я с моделями, так как эти состоят schemas в том, что они используются, чтобы создавать Модели. Очень важно понимать различие.

3
ответ дан 24.11.2019, 14:41
  • 1
    @LLaza не забывай помечать ответ как принятая, если ты sirvi и # 243; – devconcept 08.08.2016, 15:30

Теги

Похожие вопросы