我有两个集合:snmpvalues = 'output taken from pysnmp' ### Code not included ###
def netstat(request):
for line in snmpvalues:
if line == '1':
return ('Green') ### Network is up ###
else:
return ('red') ### System is down ###
和document
。其结构如下所示:
citation
我想查询每个文档的引用文档(称为引用,用# document
{id:001, title:'foo'}
{id:002, title:'bar'}
{id:003, title:'abc'}
# citation
{from_id:001, to_id:002}
{from_id:001, to_id:003}
表示)的信息。在SQL中,我将使用to_id
表的左联接document
,然后左联接citation
来获取引用的完整信息(而不仅仅是它们的ID)。
但是,我只能在MongoDB中使用document
来实现第一步。这是我的汇总管道:
$lookup
通过此管道,我可以获得以下结果:
[
{'$lookup':{
'from': 'citation',
'localField': 'id',
'foreignField': 'from_id',
'as': 'references'
}}
]
所需的结果是:
{
id:001,
title:'foo',
references:[{from_id:001, to_id:002}, {from_id:001, to_id:003}]
}
我找到了这个answer,但这似乎是一对一的关系,不适用于我的情况。
编辑:有人说在MongoDB中应该避免加入,因为它不是关系数据库。我选择MongoDB是因为它比MySQL快得多。
答案 0 :(得分:1)
您需要在同一集合上再次使用$unwind
和$lookup
,然后您应$group
_id
来获得期望的结果。
请尝试以下操作:
[
{
"$lookup": {
"from": "citation",
"localField": "_id",
"foreignField": "from_id",
"as": "references"
}
},
{
"$unwind": "$references"
},
{
"$lookup": {
"from": "doc",
"localField": "references.to_id",
"foreignField": "_id",
"as": "map"
}
},
{
"$unwind": "$map"
},
{
"$project": {
"_id": 1,
"title": 1,
"map_id": "$map._id",
"map_title": "$map.title"
}
},
{
"$group": {
"_id": "$_id",
"title": {
"$first": "$title"
},
"references": {
"$push": {
"id": "$map_id",
"title": "$map_title"
}
}
}
}
]