2017-01-16 112 views
0

我正在尝试创建一个用户可以观看项目的监视列表。我试图通过将监视列表字段添加到我的用户集合来创建它。监视列表将是与其他项目对应的ID数组。如何检查数组中的每个项目是否存在

用户收集:

  • ID:对象ID
  • 名:字符串
  • 监视列表:阵列即[9872,342,4545,234,8745]

我的问题与查询这个结构有关。我希望能够在传递用户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 ] ] } } } 
    ] 
) 
相关问题