Je ne suis pas sûr que vous puissiez résoudre ce problème avec élégance avec votre schéma actuel ; slotTypes
devrait être un tableau de sous-documents, ce qui permettrait à votre $elemMatch
requête pour travailler. Pour l'instant, c'est un objet avec des touches numériques.
Autrement dit, votre schéma de document devrait ressembler à :
{
"assetsId": {
"0": "546cf2f8585ffa451bb68369"
},
"slotTypes": [
{ "usage": "json" },
{ "usage": "image" }
]
}
Si la modification de la mise en page des données n'est pas une option, vous devrez essentiellement parcourir chaque document pour trouver des correspondances avec $where
. C'est lent, non indexable et gênant.
db.objects.find({$where: function() {
for(var key in this.slotTypes) {
if (this.slotTypes[key].usage == "json") return true;
}
return false;
}})
Vous devriez lire la documentation sur $where pour vous assurer que vous en comprenez les mises en garde, et pour l'amour de tout ce qui est saint, désinfectez vos entrées à la fonction ; c'est du code live qui s'exécute dans le contexte de votre base de données.