2015-03-12 10 views
10

Ho notato un nuovo operatore $eq rilasciato con MongoDB 3.0 e non ne capisco lo scopo. Per esempio queste due domande sono esattamente le stesse:

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

e

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

Qualcuno sa perché questo era necessario?

+0

@ user2864740 è valido, questo documento indica che tali query ('{age: 21}' e '{age: {$ eq: 21}}') sono uguali: http://docs.mongodb.org/ manuale/riferimento/operatore/query/eq/ – Messa

+0

@Messa In quale confusione, ho aperto la pagina errata :( – user2864740

+1

Sì, sembra confuso :) Forse '$ eq' (nelle query" normali ") deve distinguere tra' null 'e chiave assente. Ma non posso provarlo ora. – Messa

risposta

7

Il problema era che si avrebbe dovuto gestire l'uguaglianza in modo diverso dal confronto quando si aveva qualche tipo di generatore di query, quindi è

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

ma

{ a : 3 } 

per l'uguaglianza, che sembra completamente diverso. Lo stesso vale per la composizione di $not, come già sottolineato da JohnnyHK. Inoltre, confrontando con $eq si risparmia dal dover $ -escape stringhe fornite dall'utente. Pertanto, le persone asked for alternatives that are syntactically closer ed è stato implementato. Il biglietto Jira contiene una discussione più lunga che menziona tutti questi punti.

La sintassi più chiara di un operatore $eq potrebbe anche avere senso nel quadro di aggregazione per confrontare due campi, se such a feature deve essere implementato.

Inoltre, la funzione è apparentemente in giro dal 2,5, era added to the documentation relatively late.

5

Un'applicazione specifica posso vedere di $eq è con casi come l'operatore $not che richiede che il suo valore è un operator-expression.

Questo permette di costruire una query come:

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

Prima, il più vicino si potrebbe arrivare a questo semanticamente era:

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

Mi rendo conto che ci sono altri modi per rappresentare la funzionalità di quella query, ma se è necessario utilizzare l'operatore $not per altri motivi, questo ora lo consentirebbe.

+1

Prima di poter usare' $ ne' (ma probabilmente lo sai questo) :) –

+2

È strano, però. Pensavo che questo operatore esistesse da molto tempo. –

+2

@SergioTulentsev È sempre stato lì. L'unica cosa nuova è la documentazione. Quindi tutte le risposte sono piuttosto divertenti. –