sua semplice da fare in MongoDB, ma la parte più difficile sta preparando i dati per la query. Mi spiego che in oder
semplice parte
È possibile utilizzare $in
di trovare gli elementi corrispondenti in una matrice. Proviamo
db.coll.find({a:{$in:[1,2,3,5]})
e il risultato è
{ "_id" : ObjectId("4f37c41739ed13aa728e9efb"), "a" : [ 1, 2 ] }
{ "_id" : ObjectId("4f37c42439ed13aa728e9efc"), "a" : [ 1, 3, 8 ] }
{ "_id" : ObjectId("4f37c42c39ed13aa728e9efd"), "a" : [ 1, 2, 5 ] }
{ "_id" : ObjectId("4f37c43439ed13aa728e9efe"), "a" : [ 3, 5, 1 ] }
{ "_id" : ObjectId("4f37c43e39ed13aa728e9eff"), "a" : [ 4, 5 ] }
Ohh, non è il risultato che ci aspettavamo. Sì perché $ restituisce un articolo se viene trovato un elemento corrispondente (non necessariamente tutto).
Quindi possiamo risolvere questo problema passando gli elementi esatti dell'array a $ in, ad esempio se vogliamo trovare gli elementi che corrispondono a questi array esatti {a: [1,2]} {a: [1,2,5 ]} e {a: [4,5,6]}
db.coll.find({a:{$in:[[1,2],[1,2,5],[4,5,6]]}})
otterrete
{ "_id" : ObjectId("4f37c41739ed13aa728e9efb"), "a" : [ 1, 2 ] }
{ "_id" : ObjectId("4f37c42c39ed13aa728e9efd"), "a" : [ 1, 2, 5 ] }
Questo è tutto
parte più difficile
La parte più difficile è quella di formare tutte le possibili combinazioni della matrice di input [1,2,3,5]. Devi trovare un modo per ottenere tutta la combinazione dell'array sorgente (dal tuo client) e passarlo a $ in.
Ad esempio, questo JS method vi darà tutte le combinazioni di matrice data
var combine = function(a) {
var fn = function(n, src, got, all) {
if (n == 0) {
if (got.length > 0) {
all[all.length] = got;
}
return;
}
for (var j = 0; j < src.length; j++) {
fn(n - 1, src.slice(j + 1), got.concat([src[j]]), all);
}
return;
}
var all = [];
for (var i=0; i < a.length; i++) {
fn(i, a, [], all);
}
all.push(a);
return all;
}
>> arr= combine([1,2,3,5])
vi darà
[
[
1
],
[
2
],
[
3
],
[
5
],
[
1,
2
],
[
1,
3
],
[
1,
5
],
[
2,
3
],
[
2,
5
],
[
3,
5
],
[
1,
2,
3
],
[
1,
2,
5
],
[
1,
3,
5
],
[
2,
3,
5
],
[
1,
2,
3,
5
]
]
e si può passare questo arr
a $ per trovare tutte le macthing elementi
db.coll.find({a:{$in:arr}})
ti darà
{ "_id" : ObjectId("4f37c41739ed13aa728e9efb"), "a" : [ 1, 2 ] }
{ "_id" : ObjectId("4f37c42c39ed13aa728e9efd"), "a" : [ 1, 2, 5 ] }
Attendi !, non restituisce ancora i restanti due possibili elementi.
Perché avere una buona occhiata al arr, si trova solo la combinazione. restituisce [1,3,5]
ma i dati nel documento sono [3,5,1]
. Quindi è chiaro che $in
controlla gli articoli in ordine dato (strano!).
Così ora si capisce il suo il veramente duro confronto tra la query MongoDB !. È possibile modificare il codice precedente della combinazione JS precedente per trovare la permutazione possibile per ciascuna combinazione e passarla a mongodb $in
. Questo è il trucco.
Dal momento che non ha menzionato alcuna scelta la lingua è difficile raccomandare qualsiasi codice di permutazione. Ma puoi trovare molti approcci diversi in Stackoverflow o googling.
Ti piace bisogno di scrivere un filtro personalizzato per questo in js, quindi utilizzare che, come parte della query. http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7D – Travis