MongoDb:聚合$lookup,过滤外来文档

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",

考虑到几个学院:

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不起作用,因为它会过滤掉没有旧宠物的用户,我希望用户即使没有宠物也能在那里

事实上,我也试图用同样的方法只得到每个用户最老的宠物,但我也没有找到公式

有没有办法在聚合中执行此操作

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

提前感谢。

您可以在您的
$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