Наиболее эффективная структура мангуста Схема - PullRequest
0 голосов
/ 16 сентября 2018

Мне любопытно, каков наилучший способ структурировать мою схему Мангуста.Я создаю сайт фильма со схемой пользователя, настроенной следующим образом:

let UserSchema = new mongoose.Schema({
    username: {
        type: String,
        index: true
    },
    password: {
        type: String
    },
    email: {
        type: String
    },
    name: {
        type: String
    },
    watchlist: [mongoose.Schema.Types.Mixed],
    seen: {
        like : {
            type: [mongoose.Schema.Types.Mixed]
        },
        dislike: {
            type: [mongoose.Schema.Types.Mixed]
        }
    },
});

Когда пользователь нажимает значок с изображением пальца вверх или вниз, объект

{movieID: movieID, title: movieTitle, poster: moviePoster}

будет отправлено в массив like или dislike в свойстве visible.Я собираюсь использовать эту информацию в своем шаблоне EJS, чтобы определить, был ли фильм уже просмотрен, и если он был просмотрен и понравился, то выделите серым цветом кнопку неприязни, а если она видна и не понравилась, выделите серым кнопку аналога.Я также хочу иметь возможность удалить элемент из увиденного, если пользователь нажимает кнопку «Очистить».Чтобы сделать это, мне кажется, что мне придется зацикливаться на обоих массивах, чтобы определить, включен ли фильм в один, а затем удалить его.Кажется, должен быть лучший способ сделать это.Я думал о структурировании «видимого» объекта с использованием movieID в качестве ключа, например:

seen: {
  '123': {
    movieID: '123',
    title: 'movieA',
    poster: 'movieA-poster.jpg',
    like: true
  }, 
  '456' : {
    movieID: '456',
    title: 'movieB',
    poster: 'movieB-poster.jpg',
    like: false
  }
}

Но когда я пытаюсь отправить данные в видимое с использованием .findOne и этой функции:

const movieObj = {
  id: req.body.movieID,
  title: req.body.movieTitle,
  poster_path: req.body.poster_path,
};

User.findOne({_id: req.user._id}, function(err, user) {
  if (err) {
    console.log(err);
  } else {

    user.seen[req.body.movieID] = movieObj;
    user.save(function(){});
  }
}

Я все еще просто возвращаю пустой объект.Я изменил видимый объект схемы на:

seen: { type: mongoose.Schema.Types.Mixed, default: {} }

и установил {minimal: false}, потому что я прочитал, что мангуст по умолчанию не допускает пустых объектов.Цените любые указания о том, что я делаю неправильно, или если у вас есть лучший способ эффективно структурировать схему, чтобы можно было легко добавлять или удалять просмотренные фильмы из БД.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

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

1. Схема пользователя

let UserSchema = new mongoose.Schema({
    username: {
        type: String,
        index: true
    },
    password: {
        type: String
    },
    email: {
        type: String
    },
    name: {
        type: String
    },
    watchlist: [mongoose.Schema.Types.Mixed],
    like : [mongoose.Schema.Types.ObjectId], //remove
    deslike : [mongoose.Schema.Types.ObjectId], //remove
    seen : [{
    movieId : { type:  : mongoose.Schema.Types.ObjectId,  ref: 'Movie' },
    isStatus : {type : string} //Enum [like,dislike,'seen']
}]
})

2. Схема фильма

let movieSchema = new mongoose.Schema({
    tile: {
    type: String
  },
  description: { type: String }
})

3.Хранилище данных в обеих таблицах

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

 {
        "_id" : ObjectId("5b5acaf0589ff6bfb5dd091f"),
"seen" : [ 
        {
            "movieId" : ObjectId("5b9e2544953b5f69683059d4"),
            "isStatud" : "like"
        }, 
        {
            "movieId" : ObjectId("5b9e2544953b5f69683059d6"),
            "isStatud" : "dislike"
        }, 
        {
            "movieId" : ObjectId("5b9e256d953b5f69683059ee"),
            "isStatud" : "seen"
        }
    ]
        "like" : [ 
            ObjectId("5b9e2544953b5f69683059d4"), 
            ObjectId("5b9e256d953b5f69683059ee")
        ],
        "deslike" : [ 
            ObjectId("5b9e2544953b5f69683059d6")
        ]
    }

/ фильм /

{
    "_id" : ObjectId("5b9e2544953b5f69683059d4"),
    "title" : "movie1",
    "description" : "desc1"
}

{
    "_id" : ObjectId("5b9e2544953b5f69683059d6"),
    "title" : "movie2",
    "description" : "desc2"
}

{
    "_id" : ObjectId("5b9e256d953b5f69683059ee"),
    "title" : "movie3",
    "description" : "desc3"
}

Запрос на получение пользователей по фильму

/ Это нормально работает и проверено /.

db.getCollection('user').aggregate([{
    $match : { _id : ObjectId("5b5acaf0589ff6bfb5dd091f") }
    },
    {$lookup : {
        from : 'movie',
        localField : 'like',
        foreignField : '_id',
        as : "likes"
        }},

        {$lookup : {
        from : 'movie',
        localField : 'deslike',
        foreignField : '_id',
        as : "deslikes"
        }}

    ])

/ Запрос с группой /

db.getCollection('user').aggregate([{
    $match : { _id : ObjectId("5b5acaf0589ff6bfb5dd091f") }
    },
    {$unwind : '$seen'},
    {$lookup : {
        from : 'movie',
        localField : 'seen.movieId',
        foreignField : '_id',
        as : "seen.movieData"
        }},
    {$unwind : '$seen.movieData'},
    { $group: { "_id": "$_id", 
              "name" : { "$first": "$name" }, //use same all other field of user
              "seen" : {"$push" : "$seen"}
               } ,
                }
    ])

Пожалуйста, проверьте и сообщите мне любую помощь.

0 голосов
/ 16 сентября 2018

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

https://hashnode.com/post/how-do-i-successfully-populate-a-mongoose-schema-cj339r6kt004g5mk83ycujilq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...