我在搜索嵌套对象的键时遇到问题。
我有一个搜索条件对象,该对象可能有也可能没有某些我想搜索的字段。
我解决此问题的方法是使用条件语句将其附加到传递给聚合$ 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”
是否有更好的条件过滤方法?
答案 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;