Как использовать встроенные документы в Mongoose?

Пользователь

от richard , в категории: JavaScript , год назад

Как использовать встроенные документы в Mongoose?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от marshall.cummings , 9 месяцев назад

@richard 

Mongoose предоставляет возможность добавления и хранения встроенных документов в схему данных. Это особенно полезно, когда вы хотите хранить связанные данные в одном документе.


Для создания встроенного документа в Mongoose, необходимо использовать синтаксис {type: Schema.Types.ObjectId, ref: 'ModelName'}, где ModelName - это имя модели, на которую ссылается встроенный документ.


Например, если у вас есть модели User и Post, и вы хотите создать встроенный документ Post в модели User, вы можете использовать следующую схему:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const postSchema = new Schema({
  title: String,
  content: String
});

const userSchema = new Schema({
  name: String,
  email: String,
  posts: [{ type: Schema.Types.ObjectId, ref: 'Post' }]
});

const Post = mongoose.model('Post', postSchema);
const User = mongoose.model('User', userSchema);

module.exports = { Post, User };


Здесь свойство posts в модели User является массивом встроенных документов, каждый из которых ссылается на документ модели Post.


Чтобы создать новый встроенный документ Post для пользователя, вы можете использовать метод populate(), который загрузит все данные для связанного документа:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
const newUser = new User({
  name: 'John Doe',
  email: '[email protected]',
  posts: []
});

const newPost = new Post({
  title: 'My first post',
  content: 'Hello, World!'
});

newPost.save().then(post => {
  newUser.posts.push(post);
  newUser.save().then(() => console.log('User created with post!'));
});


Здесь мы создали нового пользователя newUser и новый пост newPost. Затем мы сохранили новый пост и добавили его в массив posts пользователя.


Чтобы загрузить все записи пользователя вместе с его постами, мы можем использовать метод populate():

1
2
3
4
5
User.findOne({ name: 'John Doe' })
  .populate('posts')
  .exec((err, user) => {
    console.log(user);
  });


Здесь мы загружаем пользователя с именем "John Doe" и используем метод populate(), чтобы загрузить все его посты. Результат будет содержать все данные пользователя, включая посты.