Detta har alltid varit möjligt med MongoDB eftersom det alltid har funnits möjligheten att skapa frågevillkor med JavaScript-utvärdering :
db.attrs.find(function() {
var attrs = this.attrs;
return Object.keys(attrs).some(function(key) {
return attrs[key].value === "14"
});
})
Där det korrekt kommer att returnera dokumenten som matchar villkoret här genom att söka på de möjliga nycklarna i dokumentet efter det önskade värdet.
Men det är egentligen inte en fråga om "möjligt", utan mer en av "är det här verkligen en bra idé" , för vilket det grundläggande svaret är "Nej".
Databaser är ombytliga bestar som gillar att optimera med saker som index och sådant, såväl som sina egna förväntade operatörsuppsättningar för att göra sökningen så effektiv som möjligt att använda. Så ja, du kan gå igenom en språktolk som effektivt utvärderar ett kodat tillstånd över varje dokument, eller så kan du ompröva ditt designmönster.
Databaser älskar "ordning", så ge det lite, eftersom det finns en enkel organiserad omstrukturering av data du föreslår:
{
"attrs" : [
{ "key": "A1", "type" : "T1", "value" : "13" },
{ "key": "A2", "type" : "T2", "value" : "14" }
]
}
Organiserad på det sättet blir frågan så enkel som:
db.attrs.find({ "attrs.value": "14" })
Och kan naturligtvis stödja och använda ett index på någon av dessa egenskaper hos underdokumentet i arrayen.
MongoDB är trots allt en "databas", och som alla databaser är den mest angelägen om "värdena" av dess egenskaper snarare än att söka med namnen på dess "nycklar". Så saker som representerar meningsfulla "data" bör inte vara en del av namnet på en "nyckel", utan de bör snarare vara "värdet" av en "nyckel" som en "identifierare", som visas ovan.
Att ha en konsekvent väg till de data du vill fråga efter är det optimala sättet att arbeta med data inuti MongoDB. Att använda en struktur där nyckelnamn ständigt ändras, inte kan passeras av något annat än löpande kod, och det är så mycket långsammare och sämre för prestanda än att använda de inbyggda operationerna och faciliteterna som index.