sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man frågar ett relativt element med MongoDB

Allt om detta är ganska hemskt, du kan omöjligt indexera på något som "namn"-värdena och din "sökväg" till varje attribut kommer att variera överallt. Så det här är riktigt dåligt för frågor.

Jag märker att du nämner "kapslade" strukturer, och du skulle fortfarande kunna tillgodose detta med ett liknande förslag och lite extra taggar, men jag vill att du överväger detta exempel av "telefonbok":

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

Eftersom detta faktiskt är underdokument inom en array, delar fält som "namn" alltid samma sökväg, så du kan inte bara indexera dessa (vilket kommer att vara bra för prestanda) utan frågan är väldigt grundläggande:

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

Det gör precis vad du behöver genom att hitta "Jeff" i valfri "namn"-post. Om du behöver en hieraki, lägg sedan till några fält i dessa underdokument för att indikera förälder/barn-relationen som du kan använda vid efterbearbetning. Eller till och med som en materialiserad väg som kan hjälpa dina frågor.

Det är verkligen det bättre tillvägagångssättet.

Om du verkligen måste behålla den här typen av struktur, gör åtminstone något så här med JavaScriptet som kommer att lösas vid första matchen på djupet:

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 där är förkortad notation för $where operatör, vilket är ganska dåliga nyheter för prestanda, men din struktur erbjuder inte mycket annat val. I vilket fall som helst bör funktionen återkomma i varje kapslat dokument tills "fältet" med "värdet" hittas.

För allt i produktionsskala, titta verkligen på att ändra strukturen till något som kan indexeras och nås snabbt. Det första exemplet bör ge dig en utgångspunkt. Att förlita sig på godtycklig JavaScript för frågor som din nuvarande struktur tvingar dig till är dåliga nyheter.



  1. Lägg till ett nytt attribut till befintligt json-objekt i node.js

  2. Vad är det korrekta sättet att hantera Redis-anslutning i Tornado? (Async - Pub/Sub)

  3. Är det möjligt att implementera Multi-Version Concurrency Control (MVCC) ovanpå MongoDB?

  4. När ska man stänga av Transparent Huge Pages för redis