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

Come interrogare un elemento relativo usando MongoDB

Tutto in questo è abbastanza orribile, non puoi assolutamente indicizzare qualcosa come i valori del "nome" e il tuo "percorso" per ciascun attributo varierà ovunque. Quindi questo è davvero negativo per le query.

Ho notato che menzioni strutture "annidate" e potresti comunque adattare questo con una proposta simile e alcuni tag aggiuntivi, ma voglio che consideri questo esempio di tipo "rubrica":

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

Poiché si tratta in realtà di documenti secondari all'interno di un array, campi come "nome" condividono sempre lo stesso percorso, quindi non solo puoi indicizzarli (il che sarà positivo per le prestazioni), ma la query è molto semplice:

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

Questo fa esattamente ciò di cui hai bisogno trovando "Jeff" in qualsiasi voce "nome". Se hai bisogno di una gerarchia, aggiungi alcuni campi in quei documenti secondari per indicare la relazione genitore/figlio che puoi usare in post-elaborazione. O anche come un percorso materializzato che potrebbe aiutare le tue domande.

È davvero l'approccio migliore.

Se devi davvero mantenere questo tipo di struttura, almeno fai qualcosa del genere con il JavaScript che verrà salvato alla prima partita in profondità:

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;

  }
)

Il formato è una notazione abbreviata per $where operatore, che è una brutta notizia per le prestazioni, ma la tua struttura non offre molte altre scelte. In ogni caso, la funzione dovrebbe ricorrere in ogni documento nidificato finché non viene trovato il "campo" con il "valore".

Per qualsiasi cosa su scala di produzione, guarda davvero a cambiare la struttura in qualcosa che può essere indicizzato e accessibile rapidamente. Il primo esempio dovrebbe darti un punto di partenza. Fare affidamento su JavaScript arbitrario per le query poiché la tua struttura attuale ti vincola è una cattiva notizia.