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

Comment trouver le nom du champ MongoDB à une profondeur arbitraire

Vous avez raison de dire qu'un document BSON n'est pas un document XML. Étant donné que XML est chargé dans une structure arborescente composée de "nœuds", la recherche sur une clé arbitraire est assez facile.

Un document MonoDB n'est pas si simple à traiter, et il s'agit d'une "base de données" à bien des égards, on s'attend donc généralement à ce qu'il ait une certaine "uniformité" des emplacements de données afin de faciliter à la fois "l'indexation" et la recherche.

Néanmoins, cela peut être fait. Mais bien sûr, cela signifie un processus récursif s'exécutant sur le serveur et cela signifie un traitement JavaScript avec $where .

Comme exemple de shell de base, mais la function générale est juste un argument de chaîne pour le $where opérateur partout ailleurs :

db.collection.find(
  function () {
    var findKey = "find-this",
        findVal = "please find me";

    function inspectObj(doc) {
      return Object.keys(doc).some(function(key) {
        if ( typeof(doc[key]) == "object" ) {
          return inspectObj(doc[key]);
        } else {
          return ( key == findKey && doc[key] == findVal );
        }
      });
    }
    return inspectObj(this);
  }
)

Donc, fondamentalement, testez les clés présentes dans l'objet pour voir si elles correspondent au "nom de champ" et au contenu souhaités. Si l'une de ces clés se trouve être un "objet", revenez dans la fonction et inspectez à nouveau.

JavaScript .some() s'assure que la "première" correspondance trouvée reviendra de la fonction de recherche en donnant un true résultat et renvoyant l'objet où cette "clé/valeur" était présente à une certaine profondeur.

Notez que $where signifie essentiellement parcourir toute votre collection à moins qu'il n'existe un autre filtre de requête valide pouvant être appliqué à un "index" de la collection.

Utilisez donc avec précaution, ou pas du tout, et travaillez simplement à restructurer les données sous une forme plus pratique.

Mais cela vous donnera votre match.