我正试图加入两个集合。我的第一个集合有一个字符串字段,其中包含第二个集合中的文档ID。像这样:
coll A:
{ show_id: "5c5bf36bfb6fc06f4f57930c"}
coll B:
{ _id: { $oid: "5c5bf36bfb6fc06f4f57930c" } }
我无法提出正确的$ lookup。请帮忙。
答案 0 :(得分:0)
好的,因为我没有实际的模式:) ...我将尝试解释一些简单的假设。请仔细阅读以下内容!
首先,您需要一个show集合,并且要使其简洁明了,假设它只有两个字段:_id(标识符)和showTime ..(更好)
第二,您需要一个电影收藏集,假设它具有3个字段:_id(标识符),标题和[showID](showID是引用了show collection的objectID数组)
第三,预订集合,因此它应该具有:_id,movieID(特定电影文档的objectID)和showID(特定显示文档的ojectID)。
因此,您的模型将是:
bookings{
_id,
movieID,
showID
}
movies{
_id,
title,
[showID]
}
shows{
_id,
showTime
}
这是mongodb中存在的示例模拟数据:
//shows collection
{
_id: 1
showTime:"3 PM"
}
{
_id: 2
showTime:"6 PM"
}
//movies collection
{
_id: 1
title:"Matrix"
showID:[1,2]
}
{
_id: 2
title:"John Wick"
showID:[1,2]
}
//bookings collection
{
_id:1
movieID:1
showID:1
}
{
_id:2
movieID:1
showID:2
}
{
_id:3
movieID:2
showID:2
}
那么,让我们说您想查看特定的预订历史记录,那么您可以执行以下代码来查看预订,电影和节目之间的关系(联接):
db.bookings.aggregate([
// Join with shows collection
{
$lookup:{
from: "shows", // shows collection
localField: "showID", // field name of bookings collection
foreignField: "_id", // field name of show collection
as: "shows_info" // alias for show collection
}
},
{ $unwind:"$shows_info" }, // $unwind used for getting data in object or for one record only
// Join with movies collection
{
$lookup:{
from: "movies",
localField: "movieID",
foreignField: "_id",
as: "movies_info"
}
},
{ $unwind:"$movies_info" },
// query for your matching condition here, for example in this case, it would be _id of bookings collection
{
$match:{
$and:[{"_id" : 1}] // here if you replace 1 with 2, you would get data of booking id 2 and so on...
}
},
// define which fields you want to fetch
{
$project:{
_id : 1,
movieID : 1, // field of bookings collection
showID : 1, // field of bookings collection
movieTitle : "$movies_info.title",// field of movies collection
showTime : "$shows_info.showTime",// field of shows collection
}
}
]);
以下是一些结果输出:
我希望这可以解决您的问题……恕我直言,如果您也要执行数据建模以更好地了解集合的处理方式,那就更好了,请看mongoose。如果您想详细了解如何以及如何以这种方式使用$ unwind和$ lookup,请查阅mongodb的官方文档,或者甚至可以研究此question以获得清晰的参考。希望对您有帮助!