给定几个集合:
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/