MongoDb:聚合$lookup,过滤外来文档
考虑到几个学院: 1.用户MongoDb:聚合$lookup,过滤外来文档,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,考虑到几个学院: 1.用户 { name: ... id: ... city: ... age: ... otherdata: ... } 2.宠物 { name: ... owner: ... type: ... age: ... } 我正在尝试使用聚合和$lookup来构建一组对象,这些对象表示带宠物的用户: collectionusers.aggregate([ { $lookup: { from: "pets",
{
name: ...
id: ...
city: ...
age: ...
otherdata: ...
}
2.宠物
{
name: ...
owner: ...
type: ...
age: ...
}
我正在尝试使用聚合和$lookup来构建一组对象,这些对象表示带宠物的用户:
collectionusers.aggregate([
{
$lookup: {
from: "pets",
localField: "id",
foreignField: "owner",
as: "pets"
}
}
]);
但是我想添加一个过滤器,这样每个用户只能添加1岁以上的宠物(使用宠物对象中的“年龄”字段)
问题是,在聚合中添加$match不起作用,因为它会过滤掉没有旧宠物的用户,我希望用户即使没有宠物也能在那里
事实上,我也试图用同样的方法只得到每个用户最老的宠物,但我也没有找到公式
有没有办法在聚合中执行此操作
当然,目前我正在处理返回的对象
提前感谢。您可以在您的$lookup
阶段生成的pets
数组上使用数组聚合运算符
要输出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 ] }
}
}
}
}
]);
要输出最旧的pets,只需将先前聚合管道中的$filter
运算符的cond
字段替换为
cond: { $eq: [ "$$pet.age", { $max: "$pets.age" } ] }
太好了,谢谢。还有一点我想我会调查一下我自己,但以防万一你跑得更快:如果我只是想限制“宠物”数组中宠物的数量呢?:-)查看操作符并在
$project
阶段使用它,而不是$filter
。是的,我正在使用$slice,但在切片之前我需要一些排序。。。我想切片正确的:-)我仍然需要排序。过滤器给了我$gte 1,切片给了我一些,但没有最老的:-)我不知道如何预排序。在$filter
之后,使用如图所示的阶段,然后执行$slice
。