如何使用MongoDB和Node.js根据用户输入从多级文档中过滤记录?

时间:2019-01-21 10:29:51

标签: node.js mongodb

我需要根据用户输入使用聚合函数从MongoDB的多级文档中获取数据,但未获得预期的结果。我在下面提供文件格式。

{
    "zone_list":[{
        "zone":'NORTH',
        "state_list":[{
            "state":"DELHI",
            "location_list":[{
                "location":"NEW DELHI",
                "task_list":[{
                    "login_id":"9937229853"
                },{
                   "login_id":"9937229854" 
                }]
            },{
                "location":"AIRPORT",
                "task_list":[{
                    "login_id":"9937229855"
                }]
            }]
        },{
           "state":"JK",
            "location_list":[{
                "location":"NEW JK",
                "task_list":[{
                    "login_id":"9937229856"
                },{
                   "login_id":"9937229857" 
                }]
            },{
                "location":"AIRPORT JK",
                "task_list":[{
                    "login_id":"9937229858"
                }]
            }] 
        }]
    },{
        "zone":'EAST',
        "state_list":[{
            "state":"WB",
            "location_list":[{
                "location":"KOLKATA",
                "task_list":[{
                    "login_id":"9937229859"
                },{
                   "login_id":"9937229850" 
                }]
            },{
                "location":"ASAM",
                "task_list":[{
                    "login_id":"9937229895"
                }]
            }]
        },{
           "state":"ODISHA",
            "location_list":[{
                "location":"BHUBANESWAR",
                "task_list":[{
                    "login_id":"9937229844"
                },{
                   "login_id":"9937229845" 
                }]
            },{
                "location":"AIRPORT BBSR",
                "task_list":[{
                    "login_id":"9937229846"
                }]
            }] 
        }]
    }]
}

以上是我在数据库中插入的文档。在这里,我需要通过匹配区域,状态和位置来过滤数据。假设用户已输入zone='NORTH' and state='DELHI' and location='AIRPORT',因此应提取相应的记录。我正在使用以下查询,但未找到预期的输出。

db.collection.aggregate([
    {$match:{}},
    {$unwind:"$zone_list"},
    {$unwind:"$state_list"},
    {$match:{zone:zoneInput,state:stateInput}}])
    .toArray((err,docs)=>{
        if (!err) {
            res.send(docs);
        }
})

在这里,我得到的是空白输出。我需要用户输入zone,state and location作为输入,将检索相应的结果。

1 个答案:

答案 0 :(得分:2)

看起来state_list嵌套在zone_list内,所以这里是第二个$unwind,请尝试:

db.collection.aggregate([
    {
        $unwind: "$zone_list"
    },
    {
        $unwind: "$zone_list.state_list"
    },
    {
        $match: {
            "zone_list.zone": "NORTH",
            "zone_list.state_list.state": "DELHI",
            "zone_list.state_list.location_list.location": "AIRPORT"            
        }
    }
])