这个问题与这个问题有关:simple vote system with 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 被 id 为 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} })