尝试围绕聚合功能 并无法弄清楚如何过滤结果 没有聚集的孩子?
让我说我有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 things
至birds
,我可以使用{$unwind: '$birds'}
但每个thing
可以有很多birds
在这一点上,我以编程方式进行过滤,但这使其他一些事情变得混乱(此示例是简化版本)。
所以我希望从已过滤的mongo中获取结果。
有办法吗?
谢谢
答案 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": [] }}}
阶段