Этот вопрос связан с этим: простая система голосования с MongoDB
У меня есть коллекция элементов, за которые пользователи могут проголосовать за или против. Интересно, как я могу получить некоторые предметы и в то же время узнать, проголосовал ли я за них или против.
Коллекция элементов содержит элементы, более или менее похожие на следующие:
{
_id:0,
name:'Item 0',
upVoters: [ 1, 2 ],
downVoters: [ 3, 4 ]
}
{
_id:1,
name:'Item 1',
upVoters: [ 1, 3 ],
downVoters: [ 4 ]
}
{
_id:2,
name:'Item 2',
upVoters: [ ],
downVoters: [ 2 ]
}
Это означает, что, например, за элемент 0 проголосовали пользователи с идентификаторами 1 и 2, а против — пользователи 3 и 4.
Если я являюсь пользователем 2 и получаю эти элементы, я хочу знать, что я проголосовал за элемент 0, не проголосовал за элемент 1 и проголосовал против элемента 2.
Как я могу выполнить этот запрос? Я хотел бы сделать это с помощью всего одного запроса, если это возможно. Я полагаю, мне нужно использовать агрегацию, но я не могу найти способ сделать это.
Ожидаемый результат, если я запрошу элементы с точки зрения пользователя 2:
{
_id:0,
name:'Item 0',
user_vote: 1
}
{
_id:1,
name:'Item 1',
user_vote: 0
}
{
_id:2,
name:'Item 2',
user_vote: -1
}
Я могу изменить форму коллекции, если это поможет. Например, я мог бы использовать модель, аналогичную той, что была предложена в вопросе, на который я ссылаюсь выше.
Альтернативная модель:
{
_id:0,
name:'Item 0',
voters: [
{ id:1, vote:+1}, { id:2, vote:+1},
{ id:3, vote:-1}, { id:4, vote:-1}
]
}
{
_id:1,
name:'Item 1',
voters: [
{ id:1, vote:+1}, { id:3, vote:+1},
{ id:4, vote:-1}
]
}
{
_id:2,
name:'Item 2',
voters: [
{ id:2, vote:-1}
]
}
Спасибо большое
-- Ферран
РЕДАКТИРОВАТЬ:
Как я уже говорил в своих комментариях, решение, которое я нашел до сих пор, состоит в том, чтобы отправить 3 запроса: один, чтобы получить элементы, за которые проголосовали, другой, чтобы получить проголосовавшие против, и еще один, чтобы получить не проголосовавшие:
Временное решение для получения элементов и голосов за пользователя
db.items.find({ upVoters:USER_ID })
db.items.find({ downVoters:USER_ID })
db.items.find({ upVoters:{$ne:USER_ID}, downVoters:{$ne:USER_ID} })
$cond
, как они делают здесь потому что кажется, что$cond
нельзя использовать для проверки того, находится ли значение внутри массива. - person Ferran Maylinch   schedule 13.09.2013