O MongoDB 3.2 agora permite combinar dados de várias coleções em uma por meio do estágio de agregação $lookup. Como exemplo prático, digamos que você tenha dados sobre livros divididos em duas coleções diferentes.
Primeira coleção, chamada
books
, com os seguintes dados:{
"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"
}
E a segunda coleção, chamada
books_selling_data
, com os seguintes dados:{
"_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
}
Para mesclar as duas coleções, basta usar $lookup da seguinte maneira:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
Após essa agregação, os
books
coleção terá a seguinte aparência:{
"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
}
]
}
É importante observar algumas coisas:
- A coleção "de", neste caso
books_selling_data
, não pode ser fragmentado. - O campo "as" será um array, como no exemplo acima.
- As opções "localField" e "foreignField" no estágio $lookup serão tratadas como nulas para fins de correspondência se não existirem em suas respectivas coleções (os documentos $lookup têm um exemplo perfeito sobre isso). l>
Então, como conclusão, se você quiser consolidar as duas coleções, tendo, neste caso, um campo flat copy_sold com o total de cópias vendidas, você terá que trabalhar um pouco mais, provavelmente usando uma coleção intermediária que irá, então, ser $out para a coleção final.