Коллекция 1: Series ofMovies
- MovieType (Сериал, Триология, Кино)
- Категория фильма (Ужасы, Триллер, Действие и т. Д.)1008 *
- RegionLocation (США, Калифорния, ЕС и т. Д.)
Коллекция 2: Фильмы
- Категории фильмов (идентификаторкатегории)
- Movie_relatedSerie (идентификатор MovieSerie)
Коллекция 3: Пользователь
- Пользовательские настройки (которые содержат предпочтительный фильмТипы, предпочтительные категории фильмов, предпочтительное расположение региона)
NB: , принимая во внимание, что типы фильмов, категории фильмов и расположение регионов являются массивами идентификаторов
Примечание: Принимая во внимание, что пользователь может выбрать один или несколько или ни одного из следующих элементов: Типы, категории и регион
Проблема : мне нужно выполнить запроспринимая во внимание тип, категорию и расположение фильма, исходя из предпочтений пользователяпоказать соответствующие сериалы фильмы пользователю.
Решение: , которое я достиг:
поиск доступных фильмов с приоритетом для следующих комбинаций: фильмы относятся к предпочтительному типу фильма,предпочитаемая категория фильма и предпочтительное RegionLocation
, если region и введите и category , то предоставьте определенный пример оценки 7
- если введите и категории , тогда наберите 6
- , если регион и категории оценка5
- если регион и введите оценка 4
- если категории только тогда наберите 3
- если введите только оценка 2
- если регион только оценка 1
- , затем сортируйте фильмы по баллам
- , затем группируйте фильмы по Movie_relatedserie
- , затем отобразите серию на основе упомянутой выше релевантности
Mongoose Query, который я пробовал, но не отображал элементы по мере необходимости.кольцо всегда показывает 0 для всех элементов
узел js Код маршрута, который содержит запрос:
router.post('/seriesmovies/:skip/:limit',function(req,res){
if(req.body.Categories) {
Categoryids = req.body.Categories.map(function(el) {
return mongoose.Types.ObjectId(el)
});
}else{
Categoryids =[]
}
if (req.body.region) {
RegionIds = req.body.region.map(function(el){
return mongoose.Types.ObjectId(el)
});
} else {
RegionIds = []
}
if (req.body.type) {
Typeids = req.body.type.map(function(el){
return mongoose.Types.ObjectId(el)
});
}else {
Typeids=[]
}
Movies.aggregate([
{ $lookup: {from: 'MoviesSeries', localField: 'Movie_relatedSerie ', foreignField: '_id', as: 'moviesseries'} },
{ "$match": {
"$or": [
{ "Moviecategories ": {$in:Categoryids}},
{ "moviesseries.Type": {$in:Typeids}},
{"moviesseries.regionlocation": {$in:RegionIds}},
]
}},
{ "$project": {
"moviesseries.Type":1,
"moviesseries.regionlocation":1,
"moviesseries._id":1,
"Moviecategories ":1,
"_id": 1,
"scoring": {
"$cond" :{
"if": {
"$and": [{
"$in": ["$moviesseries.Type",Typeids]
},{
"$in": ["$Moviecategories",Categoryids]
},{
"$in": ["$moviesseries.regionlocation",RegionIds]
}]
},
"then":7,
"else": {
"$cond":{
"if": {
"$and": [{
"$in": ["$moviesseries.Type",Typeids]
},{
"$in": ["$Moviecategories",Categoryids]
}
]
},
"then":6,
"else":{
"$cond":{
"if": {
"$and": [{
"$in": ["$moviesseries.regionlocation",RegionIds]
},{
"$in": ["$Moviecategories",Categoryids]
}
]
},
"then":5,
"else":{
"$cond":{
"if": {
"$and": [{
"$in": ["$moviesseries.regionlocation",RegionIds]
},{
"$in": ["$moviesseries.Type",Typeids]
}
]
},
"then":4,
"else":{
"$cond":{
"if": {
"$in": ["$Moviecategories",Categoryids]
},
"then":3,
"else":{
"$cond":{
"if": {
"$in": ["$moviesseries.Type",Typeids]
},
"then":2,
"else":{
"$cond":{
"if": {
"$in": ["$moviesseries.regionlocation",RegionIds]
},
"then":1,
"else":0
}
} }
}}}
}
}
}
}
}
}
}
}
}},
{ "$sort": { "scoring": 1 } }
{ $group : { _id : "$moviesseries" }}
]).skip(Number(req.params.skip))
.limit(Number(req.params.limit)).exec(function(err,endresult){
if(err) {
res.status(422).json({
status:'Failed',
error: err
});
}else {
res.json({
status:'success',
data: endresult
});
}
});
});