我正在尝试创建一个用户可以观看项目的观察列表。我试图通过向我的用户集合添加一个监视列表字段来创建它。监视列表将是与其他项目对应的ID数组。
用户收藏:
我遇到的问题与查询此结构有关。我想能够编写一个查询,其中我传入一个用户ID和一个约20个ID的数组,并检查用户观看的那些ID中的哪一个(即哪个ID存在于该用户的监视列表字段中)。
我最初尝试过这个:
db.users.find({
_id: 507c35dd8fada716c89d0013,
watchlist: { $in: [342, 999, 8745, etc...] }
});
但是这给了我包含任何监视列表项目的用户列表,这不是我想要的。我真正想要的是一个包含这样的数组的响应:
{
id: 342,
exists: true
},
{
id: 999,
exists: false
},
{
id: 8745,
exists: true
}
我甚至可以获得一系列匹配的项目:
{
_id: 507c35dd8fada716c89d0013,
watching: [342, 8745]
}
这是可行的,还是我最好将监视列表移动到一个单独的集合中,用户作为一个数组? (我对后一种方法的关注是,用户只会看几百个项目,但成千上万的用户可能会看到同一个项目。)
答案 0 :(得分:0)
您可以使用$ setIntersection运算符轻松实现第二个输出。
db.users.aggregate(
[ {$match:{"_id": 507c35dd8fada716c89d0013}},
{ $project: { "watching": { $setIntersection: [ "$watchlist", [ 342, 999, 8745 ] ] } } }
]
)