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

MongoDB:Kombiner data fra flere samlinger til én..hvordan?

MongoDB 3.2 giver nu mulighed for at kombinere data fra flere samlinger til én gennem $lookup-aggregeringsstadiet. Som et praktisk eksempel, lad os sige, at du har data om bøger opdelt i to forskellige samlinger.

Første samling, kaldet books , der har følgende data:

{
    "isbn": "978-3-16-148410-0",
    "title": "Some cool book",
    "author": "John Doe"
}
{
    "isbn": "978-3-16-148999-9",
    "title": "Another awesome book",
    "author": "Jane Roe"
}

Og den anden samling, kaldet books_selling_data , der har følgende data:

{
    "_id": ObjectId("56e31bcf76cdf52e541d9d26"),
    "isbn": "978-3-16-148410-0",
    "copies_sold": 12500
}
{
    "_id": ObjectId("56e31ce076cdf52e541d9d28"),
    "isbn": "978-3-16-148999-9",
    "copies_sold": 720050
}
{
    "_id": ObjectId("56e31ce076cdf52e541d9d29"),
    "isbn": "978-3-16-148999-9",
    "copies_sold": 1000
}

At flette begge samlinger er blot et spørgsmål om at bruge $lookup på følgende måde:

db.books.aggregate([{
    $lookup: {
            from: "books_selling_data",
            localField: "isbn",
            foreignField: "isbn",
            as: "copies_sold"
        }
}])

Efter denne sammenlægning vil books samlingen ser sådan ud:

{
    "isbn": "978-3-16-148410-0",
    "title": "Some cool book",
    "author": "John Doe",
    "copies_sold": [
        {
            "_id": ObjectId("56e31bcf76cdf52e541d9d26"),
            "isbn": "978-3-16-148410-0",
            "copies_sold": 12500
        }
    ]
}
{
    "isbn": "978-3-16-148999-9",
    "title": "Another awesome book",
    "author": "Jane Roe",
    "copies_sold": [
        {
            "_id": ObjectId("56e31ce076cdf52e541d9d28"),
            "isbn": "978-3-16-148999-9",
            "copies_sold": 720050
        },
        {
            "_id": ObjectId("56e31ce076cdf52e541d9d28"),
            "isbn": "978-3-16-148999-9",
            "copies_sold": 1000
        }
    ]
}

Det er vigtigt at bemærke et par ting:

  1. "fra"-samlingen, i dette tilfælde books_selling_data , kan ikke sønderdeles.
  2. Feltet "som" vil være et array, som eksemplet ovenfor.
  3. Både "localField"- og "foreignField"-muligheder på $lookup-stadiet vil blive behandlet som null for matchende formål, hvis de ikke findes i deres respektive samlinger ($lookup-dokumenterne har et perfekt eksempel på det).

Så som en konklusion, hvis du ønsker at konsolidere begge samlinger, og i dette tilfælde har et fladt copies_sold felt med det samlede antal solgte kopier, bliver du nødt til at arbejde lidt mere, sandsynligvis ved at bruge en mellemliggende samling, der vil være $ude til den endelige samling.



  1. Hvordan adskiller redis instansen med flere brugere, der kører på samme server?

  2. Rails, hvordan man fortæller, om en sidekiq-medarbejder er færdig med perform_async

  3. Brug af COD og CML til at bygge applikationer, der forudsiger lagerdata

  4. Redis replikeringskonfiguration