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

时间:2016-08-12 11:23:10

标签: mongodb mongodb-query aggregation-framework

考虑到几个集体:

1.-用户

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

2.- PETS

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

我尝试使用$ lookup汇总来构建一组代表用户及其宠物的对象:

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

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

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

实际上,我也试图以同样的方式只获得每个用户中最老的宠物,而且我也找不到公式。

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

当然,目前我正在返回的对象上进行此操作。

提前致谢。

1 个答案:

答案 0 :(得分:9)

您可以在<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 阶段生成的pets数组上使用$filter数组聚合运算符。

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

$lookup

要输出最旧的宠物,只需使用

替换上一个聚合管道中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 ] } } } } } ]); 运算符的cond字段
$filter