使用MongoDB聚合时-如何在没有聚合子级的情况下过滤出结果?

时间:2018-12-24 17:55:49

标签: node.js mongodb mongoose lookup

尝试围绕聚合功能 并无法弄清楚如何过滤结果 没有聚集的孩子?

让我说我有things

{ _id: abc1, thingColor: "green" }
{ _id: abc2, thingColor: "red" }
{ _id: abc3, thingColor: "amazing" }

我有birds

{ _id: 1, thing_id: "abc1", type: "singing", isBiting: false }
{ _id: 2, thing_id: "abc1", type: "notFlying", isBiting: true }
{ _id: 3, thing_id: "abc3", type: "manEating", isBiting: false }

现在我想获取一个东西列表,但是只有那些至少有一只鸟通过id与之相关联的鸟,以及只有被咬的鸟。 因此,基本上从此示例中,我仅想从things中获得:

{ _id: abc1, birds_id: "abc1" }

我的查询就是这样-查询things

  {
    $lookup:
      {
        from: 'birds',
        let: { thingIdVar: '$_id'},
        pipeline: [
          {$match:
              {$expr:
                  {$and: [
                      {$eq: ['$thing_id',  '$$thingIdVar']},
                      {$eq: ['$isBiting',  true]}
                    ]}
              }
          }
        ],
        as: 'birds'
      }
  },

这将返回与things聚合的birds,但是即使它们没有聚合birds,它也会取回所有内容。

如果我有1比1 thingsbirds,我可以使用{$unwind: '$birds'} 但每个thing可以有很多birds

在这一点上,我以编程方式进行过滤,但这使其他一些事情变得混乱(此示例是简化版本)。

所以我希望从已过滤的mongo中获取结果。

有办法吗?

谢谢

1 个答案:

答案 0 :(得分:2)

def add(request): form = CustomerForm() if request.method == "POST": form = CustomerForm(request.POST) if form.is_valid(): form.save(commit=True) notification_vars = {"toastr_title": "SUCCESS!", "toastr_message": "The Customer has been added to the database", "toastr_type": "success",} return index(request, context=notification_vars) // THIS IS WHAT I NEED TO WORK page_vars = { "page_title": "Add Customer", "page_icon": "fa-address-book", "toastr_title": "", "toastr_message": "", "toastr_type": "", "form": form} return render(request, 'customers/add.html', context=page_vars) 之后使用{% if toastr_message %} <script> var title = '{{ toastr_title }}', message = '{{ toastr_message }}', type = '{{ toastr_type }}', options = {}; toastr[type](message, title, options); </script> {% endif %} 阶段

$match

由于父集合没有障碍,它将返回所有文档。因此,要过滤掉至少包含一个$lookup的文档(事物),您必须在父集合中使用{ "$match": { "birds": { "$ne": [] }}} 阶段