Questo è sempre stato possibile con MongoDB perché c'è sempre stata la possibilità di costruire condizioni di query utilizzando Valutazione JavaScript :
db.attrs.find(function() {
var attrs = this.attrs;
return Object.keys(attrs).some(function(key) {
return attrs[key].value === "14"
});
})
Dove ciò restituirà correttamente i documenti che soddisfano la condizione qui cercando le possibili chiavi nel documento per il valore richiesto.
Ma non è proprio una domanda sul "possibile", ma più su "è davvero una buona idea" , per cui la risposta di base è "No".
I database sono animali volubili a cui piace ottimizzare con cose come indici e simili, così come il proprio set di operatori previsto per rendere la ricerca il più efficiente possibile da usare. Quindi sì, puoi utilizzare un interprete linguistico che in modo efficace la forza bruta valuti una condizione codificata in ogni documento, oppure puoi riconsiderare il tuo modello di progettazione.
I database amano "l'ordine", quindi dagli un po', poiché esiste una semplice ristrutturazione organizzata dei dati che proponi:
{
"attrs" : [
{ "key": "A1", "type" : "T1", "value" : "13" },
{ "key": "A2", "type" : "T2", "value" : "14" }
]
}
Organizzata in questo modo, la query diventa semplice come:
db.attrs.find({ "attrs.value": "14" })
E ovviamente può supportare e utilizzare un indice su una qualsiasi di quelle proprietà del documento secondario nell'array.
MongoDB è dopotutto un "database" e, come tutti i database, è più interessato ai "valori" delle sue proprietà piuttosto che alla ricerca usando i nomi delle sue "chiavi". Quindi le cose che rappresentano "dati" significativi non dovrebbero far parte del nome di una "chiave", ma piuttosto dovrebbero essere il "valore" di una "chiave" come "identificatore", come dimostrato sopra.
Avere un percorso coerente per i dati su cui desideri eseguire query è il modo ottimale per lavorare con i dati all'interno di MongoDB. L'utilizzo di una struttura in cui i nomi delle chiavi cambiano continuamente, non può essere attraversato da nient'altro che codice in esecuzione, ed è molto più lento e peggio per le prestazioni rispetto all'utilizzo delle operazioni e delle strutture native come gli indici.