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

标签 mongodb mongodb-query aggregation-framework

给定几个集合:

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/

相关文章:

mongodb - 想要更新 mongodb 中的二级数组对象

java - 使用 Jackson XML Mapper 获取列表

mongodb - 如何将排序后的数组存储回 MongoDB?

Mongodb 计数数组组合

javascript - 按最高计数聚合

mongodb - $lookup的Foreign字段可以是嵌套文档的字段吗?

MongoDB Compass 超时

mongodb - mongodb聚合中的条件$first

mongodb - 向mongodb中的1亿条记录添加一个新字段

mongodb - 如何在一个字段的一次查询中获得多个计数?