Jimmy Sawczuk给了我很大的帮助,但也激励我研究"$in",因为它是一个等号'='运算符,但这可能是不可能的。。。
我有这个代码,我想做得更漂亮(知道它看起来很复杂(所以跳过它),但我很快就会说到点子上,然后它可能就没有那么复杂了:
// First html drop down selection / filter selection
if ($key[0] <> "") {
if ($op[0] == "=") $query = array($key[0] => $val[0]);
else $query = array( $key[0] => array( $op[0] => $val[0] ) );
}
else return($query);
// Second html drop down selection / filter selection
if ($key[1] <> "") {
if ($op[1] == "=") $query = array( $log[0] => array( array($key[1] => $val[1]), $query));
else $query = array( $log[0] => array( array( $key[1] => array( $op[1] => $val[1] ) ), $query) );
}
else return($query);
我想做的是简化代码(为了简单起见,我合并了key0和key1行):
if ($key[1] <> "") $query = array( $log[0] => array( array( $key[1] => array( $op[1] => $val[1] ) ), array( $key[0] => array( $op[0] => $val[0] ) )) );
$log: logical operater: "$and", "$or"
$key: key in database
$val: value to be matched against
$op: operater e.g. "$lt", "$gt", "$lte", "$gte", "$ne" all supported by Mongo.
现在我的问题是,我想要一个$op,它是"$="或有点像$in。然而,$in似乎为多个值匹配相同的键,但在我的情况下,键可能不同。在mongo中有一个类似"$="的运算符将极大地简化我的编程。我已经读了好几篇教程,但找不到这样的运算符。我觉得奇怪的是,当你有$ne(不相等)时,为什么没有相等。我错过了什么吗,有没有解决办法(我现在做了解决办法,但看起来很难看)或者$=存在吗?
没有equal
运算符。相反,MongoDB simple使用javascript冒号作为相等运算符。
所以{x : 1}
意味着x equals 1
。在PHP中,这将翻译array('x' => 1)
。
我觉得奇怪的是,当你有$ne(不相等)时,为什么没有相等。
是的,这确实很奇怪。事实上,这是一个长期悬而未决的bug。
CCD_ 5也存在类似的问题。在2.0之前的版本中,没有$and
运算符。相反,您使用逗号{x:1, y:2}
表示x equals 1 and y equals 2
。这实际上使得使用$和/$或组合的某些查询变得非常困难。
从长远来看,我不希望这个错误被修复。它很可能会被新的聚合框架所取代,该框架实际上支持$eq
运算符。
作为一个小提示,如果您真的需要模拟$eq
,您可以使用:
{x: {$in: [1] } }
或者,无论出于何种原因,如果您想避免$in
,这也适用:
{x: {$gte: 1, $lte: 1} }
任何大于或等于且小于或等于另一个值的值都必须等于另一值。这适用于字符串:
{x: {$gte: 'James Bond', $lte: 'James Bond' } }
它不适用于数组或对象。
Equality运算符$eq
是在MongoDB 3.0中引入的。
http://docs.mongodb.org/manual/reference/operator/query/eq/