Ricerca di elementi in campo array

25 views
Skip to first unread message

Stefano Cudini

unread,
Mar 29, 2014, 11:11:52 PM3/29/14
to mongo...@googlegroups.com
salve!

scusa magari è una roba banale.. solo che è un po che cerco e non trovo nulla! Probabilmente non sto cercando con le keywords giuste!

Comunque mi serve una cosa semplicissima, devo cercare due elementi stringa all'interno di una campo array dei docs di una collection!

I due campi stringa sono ad esempio due id utenti:
"P8gST2vqKF29GwipL" e "pn5FqCGT6ACXLfRW8"

ed il campo array in cui devo cercare è semplicemente:
{
...
  usersIds:["P8gST2vqKF29GwipL","pn5FqCGT6ACXLfRW8"]
...
}
che sta all'interno di documenti che possono avere sia gli id da me cercati oppure averne di piu di meno o di altri!

pero a me serve trovare il documento che contenga solo ed esclusivamente quei due id stringa e niente altro
a prescindere anche dallordine in cui sono presenti gli elementi.

Spero di essermi spiegato ;-{

Grazie mille a chi mi risponderà!
Stefano

Stefano Cudini

unread,
Mar 31, 2014, 8:17:51 AM3/31/14
to mongo...@googlegroups.com
ho trovato questa soluzione, ma non saprei se è a via giusta... mi sembra un pò astrusa anche se funziona.. forse si potrebbe risolvere con qualcosa di piu semplice e performante?

db.collection.findOne({
$and: [
{ usersIds: {$size: 2} },
{ usersIds: {$all: ["P8gST2vqKF29GwipL","pn5FqCGT6ACXLfRW8"]} }
]
});

Grazie per chiunque voglia dare un contributo/opinione!

Flaper87

unread,
Mar 31, 2014, 9:19:02 AM3/31/14
to mongo...@googlegroups.com
2014-03-31 14:17 GMT+02:00 Stefano Cudini <stefano...@gmail.com>:
ho trovato questa soluzione, ma non saprei se è a via giusta... mi sembra un pò astrusa anche se funziona.. forse si potrebbe risolvere con qualcosa di piu semplice e performante?

db.collection.findOne({
$and: [
{ usersIds: {$size: 2} },
{ usersIds: {$all: ["P8gST2vqKF29GwipL","pn5FqCGT6ACXLfRW8"]} }
]
});


Ciao,

forse sto sbagliando a capire cosa ti serve. Ho provato a replicare il tuo scenario:

> db.test.insert({userId: [1,2,3,4]})
> db.test.insert({userId: [1,2]})
> db.test.insert({userId: [3,4,5]})
> db.test.insert({userId: [1,3,4]})
> db.test.findOne({userId: [1,2]})
{ "_id" : ObjectId("53396a951eb2b6f261a3bba3"), "userId" : [ 1, 2 ] }
> db.test.find({userId: [1,2]})
{ "_id" : ObjectId("53396a951eb2b6f261a3bba3"), "userId" : [  1,  2 ] }
> db.test.insert({userId: [1,2]})
> db.test.find({userId: [1,2]})
{ "_id" : ObjectId("53396a951eb2b6f261a3bba3"), "userId" : [  1,  2 ] }
{ "_id" : ObjectId("53396b191eb2b6f261a3bba6"), "userId" : [  1,  2 ] }
>

Ti serve qualcosa di diverso?

Flavio




Grazie per chiunque voglia dare un contributo/opinione!

Il giorno domenica 30 marzo 2014 05:11:52 UTC+2, Stefano Cudini ha scritto:
salve!

scusa magari è una roba banale.. solo che è un po che cerco e non trovo nulla! Probabilmente non sto cercando con le keywords giuste!

Comunque mi serve una cosa semplicissima, devo cercare due elementi stringa all'interno di una campo array dei docs di una collection!

I due campi stringa sono ad esempio due id utenti:
"P8gST2vqKF29GwipL" e "pn5FqCGT6ACXLfRW8"

ed il campo array in cui devo cercare è semplicemente:
{
...
  usersIds:["P8gST2vqKF29GwipL","pn5FqCGT6ACXLfRW8"]
...
}
che sta all'interno di documenti che possono avere sia gli id da me cercati oppure averne di piu di meno o di altri!

pero a me serve trovare il documento che contenga solo ed esclusivamente quei due id stringa e niente altro
a prescindere anche dallordine in cui sono presenti gli elementi.

Spero di essermi spiegato ;-{

Grazie mille a chi mi risponderà!
Stefano

--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "mongodb-it" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a mongodb-it+...@googlegroups.com.
Per postare in questo gruppo, invia un'email a mongo...@googlegroups.com.
Visita questo gruppo all'indirizzo http://groups.google.com/group/mongodb-it.
Per altre opzioni visita https://groups.google.com/d/optout.



--

Stefano Cudini

unread,
Mar 31, 2014, 9:47:13 AM3/31/14
to mongo...@googlegroups.com
Il giorno 31 marzo 2014 15:19, Flaper87 <flap...@gmail.com> ha scritto:
> db.test.insert({userId: [1,2,3,4]})
> db.test.insert({userId: [1,2]})
> db.test.insert({userId: [3,4,5]})
> db.test.insert({userId: [1,3,4]})
> db.test.findOne({userId: [1,2]})
{ "_id" : ObjectId("53396a951eb2b6f261a3bba3"), "userId" : [ 1, 2 ] }
> db.test.find({userId: [1,2]})
{ "_id" : ObjectId("53396a951eb2b6f261a3bba3"), "userId" : [  1,  2 ] }
> db.test.insert({userId: [1,2]})
> db.test.find({userId: [1,2]})
{ "_id" : ObjectId("53396a951eb2b6f261a3bba3"), "userId" : [  1,  2 ] }
{ "_id" : ObjectId("53396b191eb2b6f261a3bba6"), "userId" : [  1,  2 ] }
>

Ti serve qualcosa di diverso?


Grazie Flavio per la risposta!

Per fa capire meglio il caso d'uso.. Ho una collection con dentro delle conversazioni tra utenti..
Ogni documento rappresenta una conversazione e contiene gli degli utenti che vi partecipano.
Gli id degli utenti si trovano in un campo array e posso essere trovarsi in ordine e numero arbitrario
A me serve trovare tutte le conversazioni che contengano solo gli id che cerco, in ordine qualsiasi

Ricollegandomi al tuo esempio mi serve poter trovare tutti i doc con userId: [1,2]  oppure [2,1]
ma devo escludere i doc con userId: [1,2,3] oppure [4,3,2,1]

confidavo in qualche operatore apposito di mongodb... ma cercando non ho trovato nulla di utile!
Mi serve qualcosa che mi dica se un array contenga esattamente gli elementi che cerco in ordine casuale


Stefano Cudini

unread,
Apr 1, 2014, 12:41:07 PM4/1/14
to mongo...@googlegroups.com

sto ancora cercando! a me sembra davvero strano che vi sia una operatore per confrontare in maniera non ordinata due array!!

mi confermate?

Massimo Brignoli

unread,
Jul 19, 2014, 4:52:43 PM7/19/14
to mongo...@googlegroups.com
Vediamo se ho capito cosa ti serve:

Supponiamo di avere questa collection

set0:PRIMARY> db.test.find()
{ "_id" : 1, "results" : [ 82, 85, 88 ] }
{ "_id" : 3, "results" : [ 82, 85, 88 ] }
{ "_id" : 2, "results" : [ 75, 88, 89 ] }

E supponiamo di voler cercare i documenti che contengono ENTRAMBI in numeri 88 e 89.

Se faccio una $in ottengo:
set0:PRIMARY> db.test.find({results: {$in: [88,89]}})
{ "_id" : 1, "results" : [ 82, 85, 88 ] }
{ "_id" : 3, "results" : [ 82, 85, 88 ] }
{ "_id" : 2, "results" : [ 75, 88, 89 ] }

Quindi non va bene.
Pero' posso provare a fare una $and di due condizioni:

set0:PRIMARY> db.test.find({ $and: [{results:88},{results:89}]})
{ "_id" : 2, "results" : [ 75, 88, 89 ] }

Un'altra opzione è di utilizzare $elemMatch:

set0:PRIMARY> db.test.find({results: {$elemMatch: {$eq:88,$eq:89}}})
{ "_id" : 2, "results" : [ 75, 88, 89 ] }


Spero di aver risposto :)
Massimo
Reply all
Reply to author
Forward
0 new messages