MongoDB 3.2では、$ lookupステージを介して、複数のコレクションのデータを1つに結合できるようになりました。実際の例として、本に関するデータが2つの異なるコレクションに分割されているとします。
books
と呼ばれる最初のコレクション 、次のデータがあります:
{
"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"
}
そして、books_selling_data
と呼ばれる2番目のコレクション 、次のデータがあります:
{
"_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
}
両方のコレクションをマージするには、次のように$lookupを使用するだけです。
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
この集計の後、books
コレクションは次のようになります:
{
"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
}
]
}
いくつかの点に注意することが重要です:
- 「from」コレクション、この場合は
books_selling_data
、シャーディングできません。 - 上記の例のように、「as」フィールドは配列になります。
- $ lookupステージの「localField」オプションと「foreignField」オプションは、それぞれのコレクションに存在しない場合、照合のためにnullとして扱われます($ lookupドキュメントにその完璧な例があります)。
したがって、結論として、両方のコレクションを統合する場合は、この場合、販売されたコピーの総数を含むフラットなcopys_soldフィールドを使用する場合は、おそらく中間コレクションを使用して、もう少し作業する必要があります。最終的なコレクションに$outします。