Ho una domanda qui sotto. Voglio ottenere elementi tra 4 e 6, quindi solo a: 1 deve corrispondere perché ha il valore 5 in b.
> db.test.find({ b : { $gt : 4 }, b: {$lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>
Qualcuno può dire perché a: 2 corrisponde a questa query? Non riesco davvero a capire perché viene restituito.
Ho provato anche quello che è stato specificato nel tutorial, ma id non sembra funzionare:
> db.test.find({ b : { $gt : 4, $lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>
E questo per evitare qualsiasi confusione per quanto riguarda GT/GTE
> db.test.find({b: {$gt: 4.5, $lt: 5.5}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>
solo: 1 dovrebbe essere restituito.
Come suggerito, ho dato $ elemMatch una prova, ma non sembra lavorare sia (objectIds sono diverse perché io sono su una macchina diversa)
> db.test.find();
{ "_id" : ObjectId("4d5a24a5e82e00000000433f"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d5a24bbe82e000000004340"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
> db.test.find({b: {$elemMatch: {$gt : 4, $lt: 6 }}});
>
Nessun documento sono stati restituiti.
In realtà, entrambi i documenti devono essere restituiti, la questione significa "dammi tutti i documenti in cui' B' ha un valore compreso tra 4 e 6", e questo è soddisfatto da entrambi i documenti. Potresti spiegare più in dettaglio a cosa si desidera richiedere? Perché dovrebbe essere trovato il primo documento ma non il secondo? – Theo
Come dici sopra, voglio tutti i documenti che hanno ab tra 4 e 6. Solo a: 1 soddisfa questo (non entrambi) perché a: 2 non contiene alcun valore tra 4 e 6 (usando gt e lt escludi 4 e 6 loro stessi dove li includerebbe gte e lte). Ho provato una query diversa (vedi la domanda modificata) che è più chiara e non funziona ancora correttamente ... – paullb
Vedo cosa intendi ora, ci ho pensato come un intervallo (e gli intervalli di solito includono il primo elemento) , ma ovviamente non lo è, è un rigore minore e più grande di. Ho cancellato la mia risposta dal momento che ora è chiaro che era sbagliato. – Theo