sql >> Databasteknik >  >> NoSQL >> MongoDB

Lagra ett djupkatalogträd i en databas

Med tanke på dina krav på:

  • A) Låg RAM-användning
  • B) Möte med filstorleksbegränsningar i Mongo
  • C) Ett responsivt användargränssnitt

Jag skulle överväga något i stil med följande.

Ta den här exempelkatalogen

C:\
C:\X\
C:\X\B\
C:\X\file.txt
C:\Y\
C:\Y\file.pdf
C:\Y\R\
C:\Y\R\file.js

I JSON kan det möjligen representeras som:

{
    "C:": {
        "X": {
            "B": {},
            "file.txt": "file information..."
        },
        "Y": {
            "file.pdf": "file information...",
            "R": {
                "file.js": "file information..."
            }
        }
    }
}

Den sistnämnda, som du påpekade, skalar inte bra med stora katalogstrukturer (jag kan säga dig från första hand att webbläsare inte kommer att uppskatta en JSON-blobb som representerar ens en blygsam katalog med några tusen filer/mappar). Det förra, även om det liknar vissa faktiska filsystem och effektivt i rätt sammanhang, är jobbigt att arbeta med att konvertera till och från JSON.

Mitt förslag är att dela upp varje katalog i ett separat JSON-dokument, eftersom detta kommer att lösa alla tre frågorna, men ingenting är gratis, och detta kommer att öka kodkomplexiteten, antalet förfrågningar per session, etc.

Ovanstående struktur kan delas upp i följande dokument:

[
    {
        "id": "00000000-0000-0000-0000-000000000000",
        "type": "d",
        "name": "C:",
        "children": [
            "11111111-1111-1111-1111-111111111111",
            "22222222-2222-2222-2222-222222222222"
        ]
    },
    {
        "id": "11111111-1111-1111-1111-111111111111",
        "type": "d",
        "name": "X",
        "children": [
            "33333333-3333-3333-3333-333333333333",
            "55555555-5555-5555-5555-555555555555"
        ]
    },
    {
        "id": "22222222-2222-2222-2222-222222222222",
        "type": "d",
        "name": "Y",
        "children": [
            "44444444-4444-4444-4444-444444444444",
            "66666666-6666-6666-6666-666666666666"
        ]
    },
    {
        "id": "33333333-3333-3333-3333-333333333333",
        "type": "d",
        "name": "B",
        "children": []
    },
    {
        "id": "44444444-4444-4444-4444-444444444444",
        "type": "d",
        "name": "R",
        "children": [
            "77777777-7777-7777-7777-777777777777"
        ]
    },
    {
        "id": "55555555-5555-5555-5555-555555555555",
        "type": "f",
        "name": "file.txt",
        "size": "1024"
    },
    {
        "id": "66666666-6666-6666-6666-666666666666",
        "type": "f",
        "name": "file.pdf",
        "size": "2048"
    },
    {
        "id": "77777777-7777-7777-7777-777777777777",
        "type": "f",
        "name": "file.js",
        "size": "2048"
    }
]

Där varje dokument representerar en katalog eller fil och (om katalog) dess omedelbara underordnade ID. Underordnade föremål kan laddas lat med deras ID:n och läggas till sina förälder i användargränssnittet. Väl implementerad lazy loading kan förladda barnnoder till önskat djup, vilket skapar ett mycket lyhört användargränssnitt. RAM-användningen är minimal eftersom din server bara behöver hantera små nyttolaster per begäran. Antalet förfrågningar ökar avsevärt jämfört med ett enstaka dokument, men återigen, lite smart latladdning kan gruppera förfrågningar och minska det totala antalet.

UPPDATERING 1 :Jag förbisåg på något sätt ditt näst sista stycke innan jag svarade, så det här är nog mer eller mindre vad du tänkt dig. För att lösa problemet med för många dokument kan en viss nivå av klustringsnoder i dokument vara på sin plats. Jag måste ge mig iväg nu men jag ska fundera lite.

UPPDATERING 2 :Jag har skapat en sammanfattning av en förenklad version av klustringskonceptet jag nämnde. Det tar inte hänsyn till filer, bara mappar, och det innehåller inte och kod för att uppdatera dokumenten. Förhoppningsvis kommer det att ge dig några idéer, jag kommer att fortsätta att uppdatera det för mina egna syften.

Sammanfattning:tree_docs_cluster.js




  1. I Jongo, hur man hittar flera dokument från Mongodb genom en lista med ID:n

  2. Hantering av relationer i meteorvinkel

  3. Fyll i specifika fält i $lookup

  4. Mongoose, dra från underdokument