@Raybul

Как правильно написать mongoose схему с вложенными обьектами?

Всем привет, у меня есть схема посты, внутри нее есть массив с постами, внутри поста массив с лайками
const {
    Schema,
    model,
    ObjectId,
} = require('mongoose');


const likeSchema = new Schema({
    id: {type: ObjectId},
    userId: {type: ObjectId},
    userName: {type: String},
    userLastName: {type: String},
})

const postElementSchema = new Schema({
    id: {type: ObjectId},
    date: {type: String},
    time: {type: String},
    content: {type: String},
    likes: [likeSchema]
})

const PostSchema = new Schema({
    id: {type: ObjectId},
    userName: {type: String},
    userLastName: {type: String},
    userAvatar: {type: String},
    posts: [postElementSchema]
});

module.exports = model('Post', PostSchema);

структура должна быть примерно такой, но это не работает(
если я сделаю так
const PostSchema = new Schema({
    id: {type: ObjectId},
    userName: {type: String},
    userLastName: {type: String},
    userAvatar: {type: String},
    posts: {type: Array}
});

то все норм, но мне надо описать вложенные массивы, для того что бы я мог редактировать вложенные объекты например так
const likeParams = (args) => {
    return {
        id: uuidv4(),
        userId: args.userId,
        userName: args.userName,
        userLastName: args.userLastName,
    }
}
 const postsData = await MongoosePost.findOne({id: args.ownersId})
        postsData.posts.filter(async (post)=> {
            if(post.id === args.postId){
               post.likes.unshift(likeParams(args))
                await post.save()
     return post
            }
        })

без типизации вложенных объектов не работает
  • Вопрос задан
  • 541 просмотр
Пригласить эксперта
Ответы на вопрос 1
Grapeoff
@Grapeoff
В чём концепция...?
В таком случае вам лучше не хранить вложенные объекты, а использовать ссылки и $lookup (populate в mongoose).
Также почитайте про virtuals, localField и foreignField.

И да, в чём смысл разделения Post и Posts?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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