sql >> Database >  >> NoSQL >> MongoDB

Een relatief element opvragen met MongoDB

Alles hieraan is behoorlijk afschuwelijk, je kunt onmogelijk indexeren op zoiets als de "naam" -waarden en je "pad" naar elk attribuut zal overal variëren. Dit is dus echt slecht voor vragen.

Ik merk dat je 'geneste' structuren noemt, en je zou dit nog steeds kunnen voorzien van een soortgelijk voorstel en wat extra tags, maar ik wil dat je dit voorbeeld van het type 'telefoonboek' in overweging neemt:

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

Aangezien dit eigenlijk subdocumenten zijn binnen een array, delen velden zoals "naam" altijd hetzelfde pad, dus u kunt deze niet alleen indexeren (wat goed is voor de prestaties), maar de query is erg eenvoudig:

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

Dat doet precies wat je nodig hebt door "Jeff" te vinden in een "naam" -item. Als u een hiërarchie nodig hebt, voegt u enkele velden in die subdocumenten toe om de ouder/kind-relatie aan te geven die u bij de naverwerking kunt gebruiken. Of zelfs als een gematerialiseerd pad dat uw vragen kan helpen.

Het is echt de betere aanpak.

Als je dit soort structuur echt moet behouden, doe dan tenminste zoiets met de JavaScript die de eerste match op diepte zal redden:

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;

  }
)

Het formaat daar is een verkorte notatie voor de $where operator, wat vrij slecht nieuws is voor de prestaties, maar je structuur biedt niet veel andere keuze. In ieder geval moet de functie terugkeren in elk genest document totdat het "veld" met de "waarde" is gevonden.

Kijk voor alles van productieschaal echt naar het veranderen van de structuur in iets dat kan worden geïndexeerd en snel kan worden geopend. Het eerste voorbeeld zou u een startpunt moeten geven. Vertrouwen op willekeurig JavaScript voor zoekopdrachten, aangezien uw huidige structuur u daartoe beperkt, is slecht nieuws.



  1. MongoCursorTimeoutUitzondering voor aggregatiefunctie

  2. Hoe krijg je een collectielijst in mangoest?

  3. MongoDB verzamelpijplijnen met gekoppeld object

  4. Correcte manier om mongodb en express te starten?