我试图在Mongo数据库中使用两个参数(名称和ID)来过滤报告。我现在设置它的方式是:
// if both params are empty
if ((empty($filterParams['name'])) && (empty($filterParams['id']))) {
$views = $mongoDb->selectCollection('views')->find([], []);
}
// if one of the two params are empty
if ((!empty($filterParams['name'])) || (!empty($filterParams['id']))) {
// name is empty
if ((empty($filterParams['name']))) {
$idQuery = array('id' => (int)$filterParams['id']);
$views = $mongoDb->selectCollection('views')->find($idQuery, []);
}
// id is empty
if ((empty($filteredParams['id']))) {
$nameQuery = array('name' => $filterParams['name']);
$views = $mongoDb->selectCollection('views')->find($nameQuery, []);
}
// neither are empty
if ((!empty($filterParams['name'])) && (!empty($filterParams['id']))) {
$fullQuery = array('id' => (int)$filterParams['id'], 'name' => $filteredParams['name']);
$views = $mongoDb->selectCollection('views')->find($fullQuery, []);
}
}
我想知道是否有一种简化方法,以便插入可以在没有多个if语句的情况下进行一次。
答案 0 :(得分:1)
你当然是过度设计一个非常简单的问题。你真正需要做的就是把你的" filterParams" (可能来自请求源)并转换可能的"字符串"值" id"进入"数字"格式化您的数据库似乎期待(通过这里写的代码)。
// $filterParams = array() // or it might be blank
$filterParams = array( "id" => "1", "something" => "else" );
$query = array();
foreach( $filterParams as $key => $value ) {
if ( $key == "id" )
$query[$key] = intval($value);
$query[$key] = $filterParams[$key];
}
$views = $mongoDb->selectCollection('views')->find($query);
因此,只需从空对象开始,只需添加或转换查询所需的密钥即可。如果根本没有钥匙,那么这是一个空的" MongoDB期望的查询对象,只有一个键或两个键,那么同样的东西也会被传递。所有你真的"需要"这里是一个"字符串"进入给定字段的预期类型。
事实上,特别是因为" filterParams"似乎没有其他数据,您只需改变现有值而不是定义另一个结构。
// $filterParams = array() // or it might be blank
$filterParams = array( "id" => "1", "something" => "else" );
$query = array();
foreach( $filterParams as $key => $value ) {
if ( $key == "id" )
$filterParams[$key] = intval($value);
}
$views = $mongoDb->selectCollection('views')->find($filterParams);
对于大多数动态语言,MongoDB查询实际上只是数据结构,其格式与本机用于表达此类内容的语言相同。因此,基本原则适用于任何地方的数据结构操作。
相同的JavaScript事物例如:
//var filterParams = {};
var filterParams = {
id: "1",
something: "here"
};
Object.keys(filterParams).forEach(function(key) {
if (key == "id" )
filterParams[key] = parseInt(filterParams[key]);
});
db.collection.find(filterParams);
另外" id"通常是用于"唯一"的标识符。对象的值,就像MongoDB总是使用_id
一样。因此,考虑到当存在此密钥时,所有其他可能的查询参数都会变得多余,除非您真的"真的"想要检查是否使用对象的其他正确属性显示了正确的标识符。