Dies war mit MongoDB schon immer möglich, da es immer die Möglichkeit gab, Abfragebedingungen mit JavaScript-Auswertung :
db.attrs.find(function() {
var attrs = this.attrs;
return Object.keys(attrs).some(function(key) {
return attrs[key].value === "14"
});
})
Dabei werden die Dokumente, die der Bedingung hier entsprechen, korrekt zurückgegeben, indem die möglichen Schlüssel im Dokument nach dem erforderlichen Wert durchsucht werden.
Aber es ist nicht wirklich eine Frage nach "möglich", sondern eher nach "ist das wirklich eine gute Idee" , für die die grundlegende Antwort "Nein" ist.
Datenbanken sind unbeständige Bestien, die gerne mit Dingen wie Indizes und dergleichen sowie ihrem eigenen erwarteten Operatorsatz optimieren, um die Suche so effizient wie möglich zu gestalten. Also ja, Sie können einen Sprachinterpreter verwenden, der eine codierte Bedingung in jedem Dokument effektiv mit Brute-Force-Auswertung auswertet, oder Sie können Ihr Designmuster überdenken.
Datenbanken lieben "Ordnung", also geben Sie ihr etwas, denn es gibt eine einfache organisierte Umstrukturierung der von Ihnen vorgeschlagenen Daten:
{
"attrs" : [
{ "key": "A1", "type" : "T1", "value" : "13" },
{ "key": "A2", "type" : "T2", "value" : "14" }
]
}
Auf diese Weise organisiert wird die Abfrage so einfach wie:
db.attrs.find({ "attrs.value": "14" })
Und kann natürlich einen Index für jede dieser Eigenschaften des Unterdokuments im Array unterstützen und verwenden.
MongoDB ist schließlich eine "Datenbank", und wie alle Datenbanken befasst sie sich hauptsächlich mit den "Werten" ihrer Eigenschaften und nicht mit der Suche nach den Namen ihrer "Schlüssel". Dinge, die aussagekräftige "Daten" darstellen, sollten also nicht Teil des Namens eines "Schlüssels" sein, sondern eher der "Wert" eines "Schlüssels" als "Bezeichner", wie oben gezeigt.
Ein konsistenter Pfad zu den Daten, die Sie abfragen möchten, ist der optimale Weg, um mit Daten innerhalb von MongoDB zu arbeiten. Die Verwendung einer Struktur, in der sich Schlüsselnamen ständig ändern, kann von nichts anderem als dem Ausführen von Code durchlaufen werden, und das ist so viel langsamer und schlechter für die Leistung als die Verwendung der nativen Operationen und Einrichtungen wie Indizes.