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

Sådan forespørges et relativt element ved hjælp af MongoDB

Alt om dette er ret forfærdeligt, du kan umuligt indeksere noget som "navn"-værdierne, og din "sti" til hver egenskab vil variere overalt. Så dette er virkelig dårligt for forespørgsler.

Jeg bemærker, at du nævner "indlejrede" strukturer, og du kan stadig imødekomme dette med et lignende forslag og nogle ekstra tagging, men jeg vil have dig til at overveje dette "telefonbog"-eksempel:

{
    "phones": [
        {
           "type": "Home",
           "name" : "Jeff",
           "phone" : "123-123-1234"
        },
        {
           "type": "Work",
           "name" : "Jeff",
           "phone" : "123-123-1234"
        },
    ]
}

Da dette faktisk er underdokumenter i et array, deler felter som "navn" altid den samme sti, så du kan ikke kun indeksere disse (hvilket vil være godt for ydeevnen), men forespørgslen er meget grundlæggende:

db.collection({ "phones.name": "Jeff" })

Det gør præcis, hvad du har brug for ved at finde "Jeff" i enhver "navn"-indgang. Hvis du har brug for et hieraki, så tilføj nogle felter i disse underdokumenter for at angive forældre/barn-forholdet, som du kan bruge i efterbehandling. Eller endda som en materialiseret vej, der kunne hjælpe dine forespørgsler.

Det er virkelig den bedste tilgang.

Hvis du virkelig skal beholde denne form for struktur, så gør i det mindste noget som dette med det JavaScript, der vil redde ud ved den første kamp i dybden:

db.collection.find(
  function () {
    var found = false;

    var finder = function( obj, field, value ) {
      if ( obj.hasOwnProperty(field) && obj[field] == value )
        found = true;

      if (found) return true;

      for( var n in obj ) {
        if ( Object.prototype.toString.call(obj[n]) === "[object Object]" ) {
          finder( obj[n], field, value );
          if (found) return true;
        }
      }

    };

    finder( this, "name", "Jeff" );
    return found;

  }
)

Formatet der er stenografi for $where operatør, hvilket er temmelig dårlige nyheder for ydeevnen, men din struktur tilbyder ikke meget andet valg. Under alle omstændigheder bør funktionen gentages i hvert indlejret dokument, indtil "feltet" med "værdien" er fundet.

For alt af produktionsskala, se virkelig på at ændre strukturen til noget, der kan indekseres og tilgås hurtigt. Det første eksempel skulle give dig et udgangspunkt. At stole på vilkårlig JavaScript til forespørgsler, som din nuværende struktur begrænser dig til, er dårlige nyheder.



  1. Installation og brug af MongoDB i Grails 3.x

  2. Mongodb - Mongoimport fejl ugyldigt tegn

  3. Hvordan opdaterer man dybt indlejret array med C# MongoDB.Driver?

  4. Redis er langsom til at få store strenge