sql >> Database teknologi >  >> NoSQL >> MongoDB

Sådan finder du MongoDB feltnavn på vilkårlig dybde

Du har ret i, at et BSON-dokument ikke er et XML-dokument. Da XML er indlæst i en træstruktur, der består af "knuder", er det ret nemt at søge på en vilkårlig nøgle.

Et MonoDB-dokument er ikke så enkelt at behandle, og dette er en "database" i mange henseender, så det forventes generelt at have en vis "ensartethed" af dataplaceringer for at gøre det nemt at både "indeksere" og søge.

Ikke desto mindre kan det lade sig gøre. Men dette betyder selvfølgelig en rekursiv proces, der udføres på serveren, og det betyder JavaScript-behandling med $where .

Som et grundlæggende shell-eksempel, men den generelle function er kun et strengargument til $where operatør alle andre steder:

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);
  }
)

Så dybest set test nøglerne til stede i objektet for at se, om de matcher det ønskede "feltnavn" og indhold. Hvis en af ​​disse taster tilfældigvis er et "objekt", skal du gå ind i funktionen igen og inspicere igen.

JavaScript .some() sørger for, at det "første" fundne match vender tilbage fra søgefunktionen og giver en true resultat og returnering af objektet, hvor denne "nøgle/værdi" var til stede i en vis dybde.

Bemærk, at $where betyder i bund og grund at krydse hele din samling, medmindre der er et andet gyldigt forespørgselsfilter, end der kan anvendes på et "indeks" på samlingen.

Så brug dem med omhu, eller slet ikke, og arbejd bare med at omstrukturere dataene til en mere brugbar form.

Men dette vil give dig dit match.



  1. MongoDB - Eksporter data

  2. Kan ikke godkendes til mongo, godkendelse mislykkes

  3. Ydeevne af Redis vs Disk i cacheapplikation

  4. Hadoop Kort/Reducer vs indbygget Kort/Reducer