sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB:Spojte data z více kolekcí do jedné..jak?

MongoDB 3.2 nyní umožňuje kombinovat data z více kolekcí do jedné prostřednictvím fáze agregace $lookup. Jako praktický příklad řekněme, že máte data o knihách rozdělená do dvou různých sbírek.

První sbírka nazvaná books s následujícími údaji:

{
    "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"
}

A druhá kolekce s názvem books_selling_data s následujícími údaji:

{
    "_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
}

Ke sloučení obou kolekcí stačí použít $lookup následujícím způsobem:

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

Po této agregaci books kolekce bude vypadat následovně:

{
    "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
        }
    ]
}

Je důležité si uvědomit několik věcí:

  1. Sbírka „od“, v tomto případě books_selling_data , nelze skartovat.
  2. Pole „as“ bude pole, jako ve výše uvedeném příkladu.
  3. Obě možnosti „localField“ a „foreignField“ ve fázi $lookup budou pro účely porovnávání považovány za nulové, pokud v příslušných kolekcích neexistují (dokud je toho dokonalý příklad dokument $lookup).
  4. li>

Takže na závěr, pokud chcete sloučit obě sbírky a mít v tomto případě ploché pole copy_sold s celkovým počtem prodaných kopií, budete muset trochu více pracovat, pravděpodobně s použitím zprostředkovatelské sbírky, která pak být $out do finální kolekce.



  1. Návrh schématu MongoDB:Vždy existuje schéma

  2. Co znamená kód *((char*)-1) ='x'?

  3. Hibernujte s MongoDB

  4. Meteor:neočekávaný mongo výstupní kód 100