加入-Mongodb

时间:2019-03-20 11:55:22

标签: mongodb

我正试图加入两个集合。我的第一个集合有一个字符串字段,其中包含第二个集合中的文档ID。像这样:

coll A:
{ show_id: "5c5bf36bfb6fc06f4f57930c"}

coll B:
{ _id: { $oid: "5c5bf36bfb6fc06f4f57930c" } }

我无法提出正确的$ lookup。请帮忙。

1 个答案:

答案 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
        } 
    }
]);

以下是一些结果输出:

ID 2

enter image description here ID 3

我希望这可以解决您的问题……恕我直言,如果您也要执行数据建模以更好地了解集合的处理方式,那就更好了,请看mongoose。如果您想详细了解如何以及如何以这种方式使用$ unwind和$ lookup,请查阅mongodb的官方文档,或者甚至可以研究此question以获得清晰的参考。希望对您有帮助!