我有两个文档,我想在用户登录时显示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
}
答案 0 :(得分:0)
下面是一个聚合管道,可检索完整的产品列表,该列表指示给定的用户是否喜欢该产品。
[
{$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
将信息从users
集合中提取到products
集合中,并将其放入名为users
的数组中。
$unwind
展开users
数组,并为每个产品/用户组合创建一个对象。
$group
通过_id
将文档放回原处。它使用$max
检查用户_id中的任何一个是否与登录用户的ID相匹配。