首页 > 解决方案 > 如何检查对象在 MongoDB 的其他文档中

问题描述

我有两个文档,我想在用户登录时显示 isfav 在产品列表中

第一个产品

{
  _id: 1231,
  name: 'Product 1'  
}
{
  _id: 1232,
  name: 'Product 2'  
}
{
  _id: 1233,
  name: 'Product 3'  
}

现在我想在用户文档中进行 $lookup,其中我最喜欢的产品保存在对象中

第二个文档用户

{
  _id: 123abcd,
  name: 'ABCD' ,
  favProducts :[1211,1232] 
}

我想要结果喜欢

{
  _id: 1231,
  name: 'Product 1' ,
  isFav: true 
}
{
  _id: 1232,
  name: 'Product 2'  ,
  isFav: true 
}
{
  _id: 1233,
  name: 'Product 3'  ,
  isFav: false 
}

标签: mongodb

解决方案


下面是一个聚合管道,它检索完整的产品列表,该列表指示给定用户是否收藏了该产品。

[
    {$lookup: {
      from: 'users',
      localField: '_id',
      foreignField: 'favProducts',
      as: 'users'
    }}, 
    {$unwind: {
      path: "$users",
      preserveNullAndEmptyArrays: true
    }}, 
    {$group: {
      _id: "$_id",
      name: { $first: "$name" },
      isFav : { $max : 
      { $eq : [ "$users._id", "user2" ] } }
    }}
]

$lookup将集合中的信息提取usersproducts集合中,并将其放入名为 的数组users中。

$unwind展开users数组并为每个产品/用户组合创建一个对象。

$group将文件重新组合在一起_id。它用于$max检查是否有任何用户 _id 与登录用户的 id 匹配。


推荐阅读