MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongo Domanda di interrogazione $gt,$lt

Questo è un argomento davvero confuso. Lavoro a 10gen e ho dovuto passare un po' di tempo a girarci intorno;)

Esaminiamo come il motore di query elabora questa query.

Ecco di nuovo la domanda:

> db.test.find({ b : { $gt :  4, $lt : 6}});

Quando arriva al record sembra che non dovrebbe corrispondere...

{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }

La corrispondenza non viene eseguita su ciascun elemento dell'array, ma piuttosto sull'array nel suo insieme.

Il confronto viene eseguito in tre passaggi:

Passaggio 1 :trova tutti i documenti in cui b ha un valore maggiore di 4

b:[2,4,6,8] corrisponde perché 6 e 8 sono maggiori di 4

Passaggio 2 :trova tutti i documenti in cui b ha un valore inferiore a 6

b:[2,4,6,8] corrisponde perché 2 e 4 sono meno di 6

Passaggio 3 :trova la serie di documenti che corrispondono ai passaggi 1 e 2.

Il documento con b:[2,4,6,8] corrisponde a entrambi i passaggi 1 e 2, quindi viene restituito come corrispondenza. Tieni presente che anche i risultati vengono deduplicati in questo passaggio, quindi lo stesso documento non verrà restituito due volte.

Se vuoi che la tua query si applichi ai singoli elementi dell'array, piuttosto che all'array nel suo insieme, puoi usare l'operatore $elemMatch. Ad esempio

> db.temp.find({b: {$elemMatch: {$gt: 4, $lt: 5}}})
> db.temp.find({b: {$elemMatch: {$gte: 4, $lt: 5}}})
  { "_id" : ObjectId("4d558b6f4f0b1e2141b66660"), "b" : [ 2, 3, 4, 5, 6 ] }