2015-03-12 7 views
10

Я заметил, что новый оператор $eq освобожден от MongoDB 3.0, и я не понимаю его цели. Например эти два запроса точно так же:

db.users.find({age:21}) 

и

db.users.find({age:{$eq:21}}) 

Кто-нибудь знает, почему это было необходимо?

+0

@ user2864740 Действительно, в этих документах упоминается, что такие запросы ('{age: 21}' и '{age: {$ eq: 21}}') равны: http://docs.mongodb.org/ manual/reference/operator/query/eq/ – Messa

+0

@Messa Как смущающе, у меня была неправильная страница open :( – user2864740

+1

Да, это выглядит запутанным :) Может быть, '$ eq' (в« обычных »запросах) состоит в том, чтобы различать« null » 'и отсутствующий ключ. Но я не могу проверить это сейчас. – Messa

ответ

7

Проблема заключалась в том, что вы должны обрабатывать равенства в отличие от сравнения, когда у вас была какая-то построитель запросов, так что

{ a : { $gt : 3 } } 
{ a : { $lt : 3 } } 

но

{ a : 3 } 

равенства, которая выглядит полностью другой. То же самое относится к составу $not, как уже указывал JohnnyHK. Кроме того, по сравнению с $eq экономится от $ -переменные пользовательские строки. Поэтому люди asked for alternatives that are syntactically closer и это было реализовано. Билет Jira содержит более длительное обсуждение, в котором упоминаются все эти моменты.

Более четкий синтаксис оператора $eq может также иметь смысл в структуре агрегации для сравнения двух полей, если должно быть реализовано such a feature.

Кроме того, функция, по-видимому, была около 2,5, была added to the documentation relatively late.

5

Одно конкретное приложение я могу видеть на $eq это со случаями, как $not оператора, требует, что его значение является operator-expression.

Это позволяет построить запрос типа:

db.zips.find({state: {$not: {$eq: 'NY'}}}) 

До, ближе всего вы могли бы получить на это семантический было:

db.zips.find({state: {$not: {$regex: /^NY$/}}}) 

Я понимаю, что есть и другие способы, чтобы представить функциональности этого запроса, но если вам нужно использовать оператор $not по другим причинам, это позволило бы это сделать.

+1

До этого вы могли бы использовать' $ ne' (но вы, вероятно, знаете это) :) –

+2

Странно. Я думал, что этот оператор существует долгое время. –

+2

@SergioTulentsev Он всегда был там. Единственное, что является новым, это документация. Так что все ответы довольно забавные. –

Смежные вопросы