sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB:Kombinera data från flera samlingar till en..hur?

MongoDB 3.2 tillåter nu att man kombinerar data från flera samlingar till en genom $lookup aggregeringsstadiet. Som ett praktiskt exempel, låt oss säga att du har data om böcker uppdelade i två olika samlingar.

Första samlingen, kallad books , med följande 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"
}

Och den andra samlingen, kallad books_selling_data , med följande 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
}

Att slå samman båda samlingarna är bara en fråga om att använda $lookup på följande sätt:

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

Efter denna aggregering, books samlingen kommer att se ut så här:

{
    "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 är viktigt att notera några saker:

  1. Från-samlingen, i det här fallet books_selling_data , kan inte delas.
  2. Fältet "som" kommer att vara en array, som exemplet ovan.
  3. Både alternativen "localField" och "foreignField" på $lookup-stadiet kommer att behandlas som null i matchningssyfte om de inte finns i sina respektive samlingar ($lookup-dokumenten har ett perfekt exempel på det).

Så, som en slutsats, om du vill konsolidera båda samlingarna, i det här fallet, med ett platt fält copies_sold med det totala antalet sålda kopior, måste du arbeta lite mer, förmodligen med hjälp av en mellanliggande samling som kommer att, vara $ut till den slutliga samlingen.



  1. Mongo Ger 'duplicerat nyckelfel' på icke-unika fält

  2. En översikt över WiredTiger Storage Engine för MongoDB

  3. Sätt in stor skiva i mongodb med mongo-skal

  4. Redis Async API:er