MongoDB Academy · Oppitunti

Lähteiden välisten koostamisputkien suorittaminen

Oppijat kirjoittavat koostamisputkia, jotka yhdistävät Atlas-kokoelman dataa S3:een tallennettuihin JSON- tai Parquet-tiedostoihin yhdessä kyselyssä.

Oppitunti 3/413 vaihetta

Lähteiden välisten koostamisputkien suorittaminen on ilmainen MongoDB Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu MongoDB Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. MongoDB Academy-kurssilla on yhteensä 4 oppituntia.

Mikä tekee useiden lähteiden välisistä putkista erityisiä?

Atlas Data Federationin useiden lähteiden välinen aggregointiputki suorittaa samat MongoDB:n aggregointivaiheet, jotka tunnette, mutta kunkin vaiheen käsittelemä data voi olla peräisin eri fyysisistä järjestelmistä — S3-säilöstä, aktiivisesta Atlas-klusterista tai molemmista. Federoitu kyselymoottori huolehtii kaikesta reitityksestä, hajautuksesta ja tulosten yhdistämisestä läpinäkyvästi. Sovelluksen näkökulmasta kyse näyttää yhden MongoDB-kokoelman kyselyltä.

Yksinkertainen useiden lähteiden välinen haku

Yksinkertaisin useiden lähteiden välinen kysely on find()-kysely virtuaalikokoelmasta, jonka taustalla on S3-tiedostoja. Kyselymoottori lukee ja jäsentää tiedostot ja käyttää suodatinta. Suodattimen kentät, jotka vastaavat polun osiointimääritteitä, aiheuttavat tiedostojen automaattisen karsinnan. Kentät, jotka eivät vastaa osiointimääritteitä, käsitellään lukemisen jälkeisenä suodattimena.

// Virtual collection 'events' backed by S3 JSON files
// Path: /data/events/{year int}/{month int}/*.json

// This query prunes to /data/events/2025/1/ only
const jan2025 = await db.collection('events').find({
  year: 2025,
  month: 1,
  eventType: 'purchase'   // post-read filter (not a partition attr)
}).toArray()

S3-datan aggregointi aktiivisen kokoelman tavoin

Voitte suorittaa minkä tahansa aggregointivaiheen S3:n taustalla olevissa virtuaalikokoelmissa: $match, $group, $project, $sort, $limit. Kyselymoottori siirtää vaiheet mahdollisuuksien mukaan lähemmäs datalähdettä (erityisesti $match-vaiheen osioiden ja Parquetin sarakkeiden karsintaa varten) ja suorittaa jäljelle jäävät vaiheet omassa laskentakerroksessaan datan lukemisen jälkeen.

// Group S3-archived events by region and count
const summary = await db.collection('events_2024').aggregate([
  { $match: { year: 2024, month: { $in: [10, 11, 12] } } },  // pruning
  { $group: { _id: '$region', total: { $sum: 1 }, revenue: { $sum: '$amount' } } },
  { $sort: { revenue: -1 } },
  { $limit: 10 }
]).toArray()

Atlasin ja S3:n yhdistäminen $lookup-vaiheella

Tehokkain useiden lähteiden välinen malli on käyttää $lookup-vaihetta aktiivisen Atlas-kokoelman ja S3:een arkistoidun kokoelman yhdistämiseen. Aloittakaa putki aktiivisesta kokoelmasta ("ohjaava" kokoelma) ja tehkää haku virtuaalisesta S3-taustaisesta kokoelmasta. Sijoittakaa $match-vaihe aina mahdollisimman alkuun, jotta suoritettavien hakujen määrä pysyy pienenä.

// Join live customers (Atlas) with archived orders (S3)
const result = await db.collection('customers').aggregate([
  { $match: { tier: 'gold', region: 'EU' } },   // filter live data first
  { $lookup: {
    from: 'orders_archive',   // virtual S3-backed collection
    let: { custId: '$_id' },
    pipeline: [
      { $match: { $expr: { $eq: ['$customerId', '$$custId'] } } },
      { $project: { orderId: 1, amount: 1, date: 1 } }
    ],
    as: 'orderHistory'
  }},
  { $addFields: { totalSpend: { $sum: '$orderHistory.amount' } } },
  { $sort: { totalSpend: -1 } },
  { $limit: 50 }
]).toArray()

Useiden Atlas-klustereiden välinen aggregointi

Jos federoidulla instanssillanne on useita Atlas-klusterien tallennuspaikkoja, voitte yhdistää eri Atlas-klustereissa olevia kokoelmia yhdessä putkessa. Tämä on hyödyllistä usean vuokraajan tai usean alueen käyttöönotossa, jossa data on jaettu erillisiin klustereihin ja tarvitsette klustereiden välisiä raportteja ilman klustereiden yhdistämistä tai erillisen raportointitietokannan rakentamista.

// Virtual collections pointing to different Atlas clusters
// 'orders_us' -> Atlas cluster in US
// 'orders_eu' -> Atlas cluster in EU

// Union results from two clusters
db.orders_us.aggregate([
  { $match: { date: { $gte: ISODate('2025-01-01') } } },
  { $unionWith: {
    coll: 'orders_eu',
    pipeline: [{ $match: { date: { $gte: ISODate('2025-01-01') } } }]
  }},
  { $group: { _id: '$status', count: { $sum: 1 } } }
])

Tulosten kirjoittaminen Atlasiin $out- tai $merge-vaiheella

Kun olette suorittaneet useiden lähteiden välisen aggregoinnin, voitte kirjoittaa tulokset takaisin aktiiviseen Atlas-kokoelmaan käyttämällä $out- tai $merge-vaihetta. Tämä on ETL-malli: historialliset tiedot luetaan S3:sta, ne yhdistetään aktiivisiin tietoihin, aggregaatit lasketaan ja tulokset kirjoitetaan Atlasissa olevaan materialisoituun näkymäkokoelmaan, josta sovellukset voivat lukea ne edullisesti ja nopeasti.

// ETL: aggregate S3 archive + Atlas, write result to Atlas
db.events_2024.aggregate([
  { $match: { year: 2024 } },
  { $group: {
    _id: { region: '$region', month: '$month' },
    sessions: { $sum: 1 },
    revenue: { $sum: '$amount' }
  }},
  { $merge: {
    into: { db: 'reporting', coll: 'monthly_summary' },
    whenMatched: 'replace',
    whenNotMatched: 'insert'
  }}
])

Parquet-sarakkeiden karsinta: lue vain tarvitsemasi

Kun teette kyselyjä Parquet-tiedostoihin, Data Federation käyttää sarakkeiden karsintaa: jos $project-vaihe määrittää vain tietyt kentät, kyselymoottori lukee Parquet-tiedostosta vain kyseiset sarakkeet (Parquet tallentaa datan sarake kerrallaan). Tämä voi vähentää luettavien tavujen määrää yli 90 % verrattuna kaikkien sarakkeiden lukemiseen. Sijoittakaa $project mahdollisimman alkuun putkessa, jotta sarakkeiden karsinnasta saadaan suurin hyöty.

// Column pruning: only reads 'region', 'amount', 'date' columns from Parquet
db.events_2024.aggregate([
  { $project: { region: 1, amount: 1, date: 1, _id: 0 } },  // early project
  { $match: { region: 'EU' } },
  { $group: { _id: '$region', totalRevenue: { $sum: '$amount' } } }
])
// Other columns (userId, sessionId, metadata, etc.) are never read from disk

Federoitujen kyselyiden suorituskyvyn valvonta

Atlas Data Federation kirjaa kyselyn suoritustiedot Atlas-käyttöliittymän Query History -välilehdelle. Jokaisessa kyselyssä näytetään käsiteltyjen tavujen määrä, suoritusaika sekä läpikäytyjen tiedostojen ja osioiden määrä. Suuri käsiteltyjen tavujen määrä tarkoittaa yleensä, että osiointimääritteet puuttuvat tai kysely ei vastaa mitään osioavaimia. Käyttäkää tätä lokia tallennusmäärityksen ja kyselymallien hienosäätöön.

// Get query stats via the admin DB on the federated instance
db.adminCommand({ currentOp: 1 })
// Shows active federated queries with bytes read, duration

// In Atlas UI: Data Federation > Query History
// Shows past queries, duration, data processed, and cost estimate

Lähteiden välisten skeemaerojen käsittely

Eri ajanjaksoilta tai järjestelmistä peräisin olevilla S3-tiedostoilla voi olla erilaiset skeemat (kenttien nimet, tyypit ja rakenne). Data Federation käsittelee tämän sujuvasti: puuttuvat kentät palautetaan arvolla null ja ylimääräiset kentät sisällytetään. Voitte käyttää putkessa $ifNull-, $cond- ja $convert-vaiheita vaihtelevien skeemojen normalisointiin ennen ryhmittelyä tai yhdistämistä.

// Normalise schema variations across old and new S3 file formats
db.events.aggregate([
  { $addFields: {
    // Old format: 'user_id', New format: 'userId'
    userId: { $ifNull: ['$userId', '$user_id'] },
    // Old format: string amount, New format: number
    amount: { $convert: { input: '$amount', to: 'double', onError: 0 } }
  }},
  { $group: { _id: '$userId', total: { $sum: '$amount' } } }
])

Federoitujen kyselytulosten välimuisti

Data Federation ei tallenna tuloksia välimuistiin kyselyiden välillä, vaan jokainen kysely lukee taustalla olevat lähteet uudelleen. Jos koontinäyttö suorittaa saman raportin toistuvasti, käyttäkää ETL-mallia: ajastakaa aggregointi, joka kirjoittaa tulokset Atlas-kokoelmaan $merge-vaiheen avulla, ja määrittäkää koontinäyttö tekemään kysely nopeasti toimivaan Atlas-kokoelmaan. Atlas Triggers voi ajastaa tämän päivityksen millä tahansa cron-välillä.

Useiden lähteiden välisten putkien rajoitukset

Huomioikaa seuraavat nykyiset rajoitukset: 1) Transaktioita ei tueta federoiduissa instansseissa. 2) Indeksejä käytetään vain Atlas-taustaisissa kokoelmissa, ei S3-tiedostoissa. 3) Erittäin suuret tulosjoukot voivat aikakatkaista — kirjoittakaa tulokset $out- tai $merge-vaiheen avulla sen sijaan, että suoratoistaisitte ne takaisin. 4) Viive on S3:n I/O:n vuoksi suurempi kuin aktiivisen Atlas-kyselyn — tämä ei sovellu käyttäjille näkyviin reaaliaikaisiin kyselyihin.

Pikatarkistus

Testatkaa tässä oppitunnissa oppimaanne MongoDB:n ja NoSQL-tietokantojen käsitteistä.

Oppitunnin yhteenveto

Tässä oppitunnissa opitte, että useiden lähteiden väliset aggregointiputket käyttävät samoja MongoDB-vaiheita S3:n tai Atlas-klustereiden taustalla olevissa virtuaalikokoelmissa, $lookup mahdollistaa aktiivisen Atlas-datan ja S3-arkistojen yhdistämisen yhdessä putkessa ja aikaisin sijoitettu $project mahdollistaa Parquet-tiedostojen sarakkeiden karsinnan ja vähentää luettavien tavujen määrää huomattavasti. Seuraavaksi tutustumme S3-datan osiointiin kyselyiden suorituskyvyn parantamiseksi.

Aloita maksutta

Opi JavaScript tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Lähteiden välisten koostamisputkien suorittaminen” ilmainen?

Kyllä – oppitunnin ”Lähteiden välisten koostamisputkien suorittaminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko MongoDB Academy-kurssin, päivitä CoddyKit PROhon. MongoDB Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Lähteiden välisten koostamisputkien suorittaminen”?

Oppijat kirjoittavat koostamisputkia, jotka yhdistävät Atlas-kokoelman dataa S3:een tallennettuihin JSON- tai Parquet-tiedostoihin yhdessä kyselyssä. Harjoittelet MongoDB Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni MongoDB Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin MongoDB Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Lähteiden välisten koostamisputkien suorittaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä MongoDB Academy-oppitunnilla?

Kyllä. Jokainen MongoDB Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Mikä on Atlas Data Federation?
  2. S3- ja Atlas-lähteiden yhdistäminen virtuaaliseen nimiavaruuteen
  3. Lähteiden välisten koostamisputkien suorittaminen
  4. S3-datan osiointi kyselyiden suorituskykyä varten
← Takaisin: MongoDB Academy