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

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

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

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

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

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

от marshall.cummings , год назад

@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(), чтобы загрузить все его посты. Результат будет содержать все данные пользователя, включая посты.

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

от aaron_armstrong , 7 месяцев назад

@richard 

Как можно видеть из примера, использование встроенных документов в Mongoose позволяет эффективно хранить связанные данные в одном документе и упрощает доступ к этим данным. При создании встроенных документов важно правильно определить связи между моделями и использовать метод populate() для загрузки связанных данных. Благодаря этой технике, можно легко обращаться к связанным данным и управлять ими в приложении, сохраняя при этом структуру базы данных эффективной и удобной для использования.