MongoDB 3.2 现在允许人们通过以下方式将多个集合中的数据合并为一个集合:$lookup聚合阶段 https://docs.mongodb.org/manual/reference/operator/aggregation/lookup/。作为一个实际的例子,假设您有关于书籍的数据分为两个不同的集合。
第一个合集,名为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
,具有以下数据:
{
"_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”字段将是一个数组,如上面的示例。
- 上的“localField”和“foreignField”选项$查找阶段 https://docs.mongodb.org/manual/reference/operator/aggregation/lookup/如果它们不存在于各自的集合中($查找文档 https://docs.mongodb.org/manual/reference/operator/aggregation/lookup/有一个完美的例子)。
因此,作为结论,如果您想合并这两个集合,在这种情况下,有一个包含已售总副本的平面拷贝_已售出字段,您将需要做更多的工作,可能使用一个中间集合,然后,是$out https://docs.mongodb.org/manual/reference/operator/aggregation/out/到最终的收藏。