gpt4 book ai didi

MongoDb:聚合 $lookup 过滤外部文档

转载 作者:IT老高 更新时间:2023-10-28 13:12:01 27 4
gpt4 key购买 nike

给定几个集合:

1.- 用户

{
name: ...
id: ...
city: ...
age: ...
otherdata: ...
}

2.- 宠物

{
name: ...
owner: ...
type: ...
age: ...
}

我正在尝试将聚合与 $lookup 一起使用来构建一组代表用户及其宠物的对象:

collectionusers.aggregate([
{
$lookup: {
from: "pets",
localField: "id",
foreignField: "owner",
as: "pets"
}
}
]);

但我想添加一个过滤器,以便每个用户只添加 1 岁以上的宠物(使用宠物对象内的字段年龄)。

问题是,在聚合中添加 $match 不起作用,因为它会过滤掉没有旧宠物的用户,我希望即使没有宠物的用户也能在那里。

其实我也在尝试以同样的方式只获取每个用户的最老的宠物,我也没有找到公式。

在聚合中执行此操作的任何方式?

当然,目前我正在处理返回的对象。

提前致谢。

最佳答案

您可以使用 $filter pets 数组上的数组聚合运算符,由您的 $lookup 阶段生成。

要输出1岁以上的宠物使用

db.users.aggregate([ 
{
$lookup:
{
from: "pets",
localField: "id",
foreignField: "owner",
as: "pets"
}
},
{
$project:
{
name: 1,
pets:
{
$filter:
{
input: "$pets",
as: "pet",
cond: { $gte: [ "$$pet.age", 1 ] }
}
}
}
}
]);

要输出最旧的宠物,只需将先前聚合管道中 $filter 运算符的 cond 字段替换为

cond: { $eq: [ "$$pet.age", { $max: "$pets.age" } ] }

关于MongoDb:聚合 $lookup 过滤外部文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38916804/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com