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

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}

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

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: {} }

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

0
G. Ball. 16 Сен 2018 в 10:37

2 ответа

Лучший ответ

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

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

2
Sagar Chaudhary 16 Сен 2018 в 10:06

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

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. хранилище данных в обеих таблицах

/ < EM> пользователь /

 {
        "_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")
        ]
    }

/ < EM> фильм /

{
    "_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"}
               } ,
                }
    ])

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

1
IftekharDani 17 Сен 2018 в 06:39