sql >> Database >  >> NoSQL >> MongoDB

MongoDB:Combineer gegevens uit meerdere collecties in één..hoe?

MongoDB 3.2 maakt het nu mogelijk om gegevens uit meerdere collecties te combineren tot één via de $lookup-aggregatiefase. Laten we als praktisch voorbeeld stellen dat u gegevens over boeken heeft die zijn opgesplitst in twee verschillende collecties.

Eerste verzameling, genaamd books , met de volgende gegevens:

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

En de tweede collectie, genaamd books_selling_data , met de volgende gegevens:

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

Om beide collecties samen te voegen is het gewoon een kwestie van $lookup op de volgende manier gebruiken:

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

Na deze aggregatie worden de books collectie ziet er als volgt uit:

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

Het is belangrijk om een ​​paar dingen op te merken:

  1. De "from" collectie, in dit geval books_selling_data , kan niet worden geshard.
  2. Het "as"-veld zal een array zijn, zoals in het bovenstaande voorbeeld.
  3. Zowel de "localField"- als de "foreignField"-opties in het $lookup-stadium worden voor vergelijkingsdoeleinden als nul behandeld als ze niet voorkomen in hun respectievelijke collecties (de $lookup-documenten hebben daar een perfect voorbeeld van).
  4. li>

Dus, als conclusie, als je beide collecties wilt consolideren, in dit geval een vlak 'copy_sold'-veld met het totale aantal verkochte exemplaren, zul je wat meer moeten werken, waarschijnlijk met behulp van een intermediaire collectie die, dan, wees $uit voor de laatste collectie.



  1. MongoDB opvragen om overeen te komen in het eerste item in een array

  2. _http_server.js:192 gooi nieuwe RangeError(`Ongeldige statuscode:${statusCode}`);

  3. Docker [Errno 111] Connect-oproep mislukt ('127.0.0.1', 6379)

  4. Databasebeveiliging 101:Toegangsrechten voor databases begrijpen