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:
- Från-samlingen, i det här fallet
books_selling_data
, kan inte delas. - Fältet "som" kommer att vara en array, som exemplet ovan.
- 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.