Mongodb - логические операторы, например, "$ lt" "$ lte" - но есть один для '=', чтобы упростить программирование - PullRequest
2 голосов
/ 28 января 2012

Джимми Сочук оказал большую помощь в дальнейшем, но также вдохновил меня на поиск «$ 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, кажется, соответствует одному и тому же ключу для нескольких значений, но в моем случае ключи могут отличаться. Наличие оператора $ = в монго очень упростит мое программирование. Я прочитал несколько учебных пособий, но не могу найти такого оператора. Я нахожу это странным, когда у вас есть $ ne (не равно), почему тогда нет равных. Я что-то пропустил, есть ли обходной путь (хорошо, я делаю обходной путь сейчас, но выглядит уродливо), или $ = существует?

Ответы [ 3 ]

6 голосов
/ 29 января 2012

Нет оператора equal.Вместо этого MongoDB simple использует двоеточие javascript в качестве оператора равенства.

Так что {x : 1} означает x equals 1.В PHP это будет переводить array('x' => 1).

Я нахожу странным то, что когда у вас есть $ ne (не равно), почему тогда нет равных.это определенно странноФактически, это длинная выдающаяся ошибка .

Аналогичная проблема существовала с $and.В версиях до 2.0 не было оператора $and.Вместо этого вы использовали запятую {x:1, y:2}, означающую x equals 1 and y equals 2.Это на самом деле сделало определенные запросы с $ и / $ или комбинациями очень сложными.

В долгосрочной перспективе я не ожидаю, что эта ошибка когда-либо будет исправлена.Вероятно, все это будет вытеснено новой структурой агрегации , которая фактически поддерживает оператор $eq.

0 голосов
/ 12 марта 2015

Оператор равенства $eq был представлен в MongoDB 3.0.

http://docs.mongodb.org/manual/reference/operator/query/eq/

0 голосов
/ 13 августа 2014

В качестве небольшой заметки, если вам действительно нужно эмулировать $eq, вы можете использовать:

{x: {$in: [1] } }

Или, если вы хотите избежать $in по любой причине, это также работает:

{x: {$gte: 1, $lte: 1} }

Любое значение, которое больше или равно и меньше или равно другому значению, должно равняться другому значению. Это прекрасно работает со строками:

{x: {$gte: 'James Bond', $lte: 'James Bond' } }

Он не будет работать с массивами или объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...