对MongoDB中的嵌套对象进行条件过滤

时间:2018-09-16 04:27:15

标签: node.js mongodb aggregation-framework aggregate

我在搜索嵌套对象的键时遇到问题。

我有一个搜索条件对象,该对象可能有也可能没有某些我想搜索的字段。

我解决此问题的方法是使用条件语句将其附加到传递给聚合$ match运算符的“匹配条件”对象上。在我需要匹配嵌套对象中的某个东西之前,它会很好地工作。

这是示例文档结构

{
        name: string,
        dates: {
            actived: Date,
            suspended: Date
        },
        address : [{
            street: string,
            city: string,
            state: string,
            zip: string
        }]

    };

我的条件对象是通过UI填充的,并传递了一个类似于以下内容的JSON:

{
        "name": "",
        "state": ""
    }

尽管我可以明确使用“ dates.suspended”, 当我尝试将address.state追加到我的搜索匹配条件时-我收到错误消息。

module.exports.search = function( criteria, callback ) 

        let matchCriteria = {
            "name": criteria.name,
            "dates.suspended": null
        };


        if ( criteria.state !== '' ) {
           // *** PROBLEM HAPPENS HERE *** //
            matchCriteria.address.state = criteria.state;
        }

        User.aggregate([
            { "$match": matchCriteria },
            { "$addFields": {...} },
            { "$project": {...} }
        ], callback );

    }

我得到了错误:

  

TypeError:无法设置未定义的属性“状态”

我了解到,当'address'还不存在时,我正在指定'address.state'-但是我不清楚我的语法将是不是matchCriteria ['address.state']或“ matchCriteria.address.state”

是否有更好的条件过滤方法?

3 个答案:

答案 0 :(得分:1)

要在嵌套对象中进行搜索,您必须使用<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id="root"></div>

可以帮助您的查询:

//为了进行测试,将unwind声明为const

criteria

答案 1 :(得分:0)

首先检查地址,然后如图所示访问属性:

if(matchCriteria['address']) {
 matchCriteria['address']['state'] = criteria['state'];
}
else {
//otherwise
}

答案 2 :(得分:0)

这应该解决它:

matchCriteria['address.state'] = criteria.state;