2015-09-20 5 views
0
movies: { 
    _id: "1" 
    name: "comedy" 
    userratings: [{ 
     user_id: "11", 
     count: 4 
    }, { 
     user_id: "22", 
     count: 2 
    }] 
} 
movies: { 
    _id: "2" 
    name: "funny" 
    userratings: [{ 
     user_id: "22", 
     count: 8 
    }] 
} 



users: { 
    _id: "11", 
    name: "jhon", 
    userFriends: [{ 
     user_id: "22" 
    }, { 
     user_id: "12" 
    }] 
} 
users: { 
    _id: "22", 
    name: "tom", 
    userFriends: [{ 
     user_id: "11" 
    }] 
} 

У меня есть две коллекции: пользователи и фильмы. Коллекция пользователей состоит из информации о пользователях и списке его друзей. Коллекция фильмов включает информацию о фильмах и рейтинг пользователей фильма.mongodb java агрегирование операции

Мой вопрос: Как я могу найти фильмы, которые оцениваются друзьями пользователя, но не являются пользователями, и закажите их по сумме подсчётов друзей, ограничьте 5 записей.

Я использую Java с MongoDB

ответ

1

Вы должны осуществить эту операцию на своем уровне приложений, то есть с использованием Java-кода. MongoDB - это хранилище документов, поэтому он не поддерживает отношения между коллекциями и то, что вы хотите сделать, связано с отношением, например, к фильмам -> user_id -> users -> friends. Вам необходимо получить отдельно пользователей и фильмы с помощью Java и реализовать соединение в вашем Java-коде. Вы не сможете сделать это с помощью одного запроса MongoDB.

Предполагая, что пользователь не может быть друзьями с ним/сама, я бы сделал это так:

1) Получить все userFriends от пользователей с _id = (your_user_id):

users.find({_id : (your_user_id)}, {userFriends.user_id : 1}) 

2) Получите все документы от фильмов, имеющих один userratings.user_id = (один из userFriends с шага 1). + group by userratings.count + limit 5. Что-то вроде этого:

movies.aggregate(
    [ 
     {$match : {userratings : {user_id : { $in (userFriends)}}}, 
     {$group : {_id : _id, count : {$sum : userratings.count}}}, 
     {$sort : {count : 1}}, 
     {$limit : 5} 
    ] 
) 
+0

Спасибо, я забыл сортировать. Я только что добавил эту часть. –

+0

Но мне нужно сопоставить всех пользователей «Друзья» в настройке и суммировать их вес. Не только совпадают по одному. – RH1212354

+0

Затем в 1) вы не фильтруете by_user_id. И ваш массив как результат 1) должен содержать идентификаторы всех пользователей пользователей, и это то, что вы используете в качестве входных данных для 2). –

Смежные вопросы