首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongodb上的聚合过滤和查找

Mongodb上的聚合过滤和查找
EN

Stack Overflow用户
提问于 2017-05-24 03:52:43
回答 1查看 1.9K关注 0票数 1

我的第一个收藏品employeecategory如下所示;

代码语言:javascript
复制
[{
    name: "GARDENING"
  },
  {
    name: "SECURITY"
  },
  {
    name: "PLUMBER"
  }
]

我的第二个收藏complaints如下所示;

代码语言:javascript
复制
[{
  communityId: 1001,
  category: "SECURITY",
  //other fields
}, {
  communityId: 1001,
  category: "GARDENING",
  //other fields
}]

我试着加入上面的表格,得到下面的结果;

代码语言:javascript
复制
[{
  "count": 1,
  "name": "GARDENING"
}, {
  "count": 1,
  "name": "SECURITY"
}, {
  "count": 0,
  "name": "PLUMBER"
}]

即使在集合2中没有记录,我也需要计数。我尝试了以下聚合,但没有起作用。如果我删除匹配条件,它是工作的,但我需要过滤社区id。能不能请一些人建议最好的方法来实现这一点。Mongo版本为3.4.0

代码语言:javascript
复制
db.employeecategory.aggregate(
  [{
    $match: {
      "complaints.communityId": 1001
    }
  }, {
    "$lookup": {
      from: "complaints",
      localField: "name",
      foreignField: "category",
      as: "embeddedData"
    }
  }]
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-24 05:13:14

不可能在单个聚合中同时实现对communityId = 1001的筛选和分组而不丢失count = 0类别。这样做的方法是首先从complaints集合开始,过滤communityId = 1001对象,并使用它创建一个临时集合。然后从employeecategory集合中,从$lookup到该临时集合,从$groupname,此时您将得到您的结果,然后删除temp表。

代码语言:javascript
复制
// will not modify complaints document, will create a filtered temp document
db.complaints.aggregate(
  [{
      $match: {
        communityId: 1001
      }
    },
    {
      $out: "temp"
    }
  ]
);

// will return the answer that is requested by OP
db.employeecategory.aggregate(
  [{
    $lookup: {
      from: "temp",
      localField: "name",
      foreignField: "category",
      as: "array"
    }
  }, {
    $group: {
      _id: "$name",
      count: {
        $sum: {
          $size: "$array"
        }
      }
    }
  }]
).pretty();

db.temp.drop(); // to get rid of this temporary collection

会产生结果;

代码语言:javascript
复制
{ _id: "PLUMBER", count: 0},
{ _id: "SECURITY", count: 2},
{ _id: "GARDENING", count: 1}

对于我所拥有的测试数据;

代码语言:javascript
复制
db.employeecategory.insertMany([
   { name: "GARDENING" },
   { name: "SECURITY" },
   { name: "PLUMBER" }
]);

db.complaints.insertMany([
   { category: "GARDENING", communityId: 1001 },
   { category: "SECURITY", communityId: 1001 },
   { category: "SECURITY", communityId: 1001 },
   { category: "SECURITY", communityId: 1002 }
]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44148665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档