Jag är inte säker på att du kommer att kunna lösa detta elegant med ditt nuvarande schema; slotTypes
bör vara en uppsättning underdokument, som skulle tillåta din $elemMatch
fråga om att arbeta. Just nu är det ett objekt med numeriska nycklar.
Det vill säga, ditt dokumentschema ska vara något i stil med:
{
"assetsId": {
"0": "546cf2f8585ffa451bb68369"
},
"slotTypes": [
{ "usage": "json" },
{ "usage": "image" }
]
}
Om det inte är ett alternativ att ändra datalayouten måste du i princip skanna igenom alla dokument för att hitta matchningar med $where
. Det här är långsamt, oindexerbart och besvärligt.
db.objects.find({$where: function() {
for(var key in this.slotTypes) {
if (this.slotTypes[key].usage == "json") return true;
}
return false;
}})
Du bör läsa dokumentationen om $where för att se till att du förstår varningarna med det, och för kärleken till allt som är heligt, sanera dina input till funktionen; detta är levande kod som körs i din databas.