MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Requête pour les documents qui ont un sous-champ interne d'une valeur donnée

Cela a toujours été possible avec MongoDB car il a toujours été possible de construire des conditions de requête en utilisant Évaluation JavaScript :

db.attrs.find(function() {
    var attrs = this.attrs;
    return Object.keys(attrs).some(function(key) {
       return attrs[key].value === "14"
    });
})

Où cela renverra correctement les documents qui correspondent à la condition ici en recherchant les clés possibles dans le document pour la valeur requise.

Mais ce n'est pas vraiment une question sur "possible", mais plutôt sur "est-ce vraiment une bonne idée" , pour lequel la réponse de base est "Non".

Les bases de données sont des bêtes capricieuses qui aiment optimiser avec des choses comme les index et autres, ainsi que leur propre ensemble d'opérateurs attendus pour rendre la recherche aussi efficace que possible à utiliser. Alors oui, vous pouvez passer par un interpréteur de langage qui évalue efficacement par force brute une condition codée dans chaque document, ou vous pouvez reconsidérer votre modèle de conception.

Les bases de données aiment "l'ordre", alors donnez-en un peu, car il y a une simple restructuration organisée des données que vous proposez :

{
    "attrs" : [
        { "key": "A1", "type" : "T1", "value" : "13" },
        { "key": "A2", "type" : "T2", "value" : "14" }
     ]
}

Organisée de cette façon, la requête devient aussi simple que :

db.attrs.find({ "attrs.value": "14" })

Et peut bien sûr prendre en charge et utiliser un index sur l'une de ces propriétés du sous-document dans le tableau.

MongoDB est après tout une "base de données", et comme toutes les bases de données, elle est plus concernée par les "valeurs" de ses propriétés plutôt que par la recherche en utilisant les noms de ses "clés". Ainsi, les éléments qui représentent des "données" significatives ne doivent pas faire partie du nom d'une "clé", mais doivent plutôt être la "valeur" d'une "clé" en tant qu'"identificateur", comme démontré ci-dessus.

Avoir un chemin cohérent vers les données que vous souhaitez interroger est le moyen optimal de travailler avec des données à l'intérieur de MongoDB. Utiliser une structure où les noms de clé changent constamment, ne peuvent être parcourus que par du code en cours d'exécution, et c'est tellement plus lent et pire pour les performances que d'utiliser les opérations natives et les installations telles que les index.