如何检查数组中的每个项是否存在

时间:2017-01-16 19:57:13

标签: mongodb mongoose

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

用户收藏:

  • id:ObjectId
  • name:string
  • 关注列表:数组即[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]
}

这是可行的,还是我最好将监视列表移动到一个单独的集合中,用户作为一个数组? (我对后一种方法的关注是,用户只会看几百个项目,但成千上万的用户可能会看到同一个项目。)

1 个答案:

答案 0 :(得分:0)

您可以使用$ setIntersection运算符轻松实现第二个输出。

db.users.aggregate(
   [ {$match:{"_id": 507c35dd8fada716c89d0013}},
     { $project: { "watching": { $setIntersection: [ "$watchlist", [ 342, 999, 8745 ] ] } } }
   ]
)