MongoDB - 使用两个集合进行查询

时间:2016-02-20 20:05:48

标签: mongodb

我正在尝试抓住MongoDB,并且已经在单个集合上尝试了一些基本查询,但我想通过以某种方式链接它们来在我的查询中使用两个集合。我有下面的文件,里面有电影的信息,

影:

{
      id:  1, 
      title: "abc", 
      release_data: "xxxx",
      IMDBURL: "qwe", 
      genre: ["xx","yy's","zz"]
}

以及另一个集合中的以下类型的文档,其中包含有关用户和嵌入文档的信息以及评级的电影以及评级本身。

用户:

{
      id:  1, 
      age: xx, 
      gender: "Y", 
      occupation: "abc", 
      zip_code: "asd", 
      movies:[
      { movie: 1, rating: 5 } , 
      { movie: 2, rating: 3 }, 
      { movie: 3, rating: 4 }, 
      { movie: 4, rating: 3 }
      ]
}

如何创建一个返回至少一次被评为5的电影标题的查询?谢谢。

1 个答案:

答案 0 :(得分:1)

  

MongoDB:没有加入,没有交易

有趣的是,我从未需要其中任何一个。与您的示例一样,您基本上必须问自己需要回答的内容并相应地对数据建模

  • 哪部电影的评分至少是五次?
  • 对于那些电影,有什么名字?

根据您的数据模型,您甚至无法逃避普通查询:您需要聚合。使用以下数据集:

{ "_id" : ObjectId("56c8e58ee99e5c4e87ec3a4e"), "age" : 22, "gender" : "Y", "occupation" : "abc", "zip_code" : "asd", "movies" : [ { "movie" : 1, "rating" : 5 }, { "movie" : 2, "rating" : 3 }, { "movie" : 3, "rating" : 4 }, { "movie" : 4, "rating" : 3 } ] }
{ "_id" : ObjectId("56c8e598e99e5c4e87ec3a4f"), "age" : 22, "gender" : "Y", "occupation" : "abc", "zip_code" : "asd", "movies" : [ { "movie" : 1, "rating" : 5 }, { "movie" : 2, "rating" : 3 }, { "movie" : 3, "rating" : 4 } ] }
{ "_id" : ObjectId("56c8e599e99e5c4e87ec3a50"), "age" : 22, "gender" : "Y", "occupation" : "abc", "zip_code" : "asd", "movies" : [ { "movie" : 1, "rating" : 5 }, { "movie" : 2, "rating" : 3 }, { "movie" : 3, "rating" : 4 } ] }
{ "_id" : ObjectId("56c8e59ae99e5c4e87ec3a51"), "age" : 22, "gender" : "Y", "occupation" : "abc", "zip_code" : "asd", "movies" : [ { "movie" : 1, "rating" : 5 }, { "movie" : 2, "rating" : 3 }, { "movie" : 3, "rating" : 4 } ] }
{ "_id" : ObjectId("56c8e59be99e5c4e87ec3a52"), "age" : 22, "gender" : "Y", "occupation" : "abc", "zip_code" : "asd", "movies" : [ { "movie" : 1, "rating" : 5 }, { "movie" : 2, "rating" : 3 }, { "movie" : 3, "rating" : 4 } ] }

您可以使用以下聚合

找到符合条件的电影
db.movies.aggregate([
  { $unwind:"$movies"},
  { $group:{ _id:"$movies.movie", ratings:{ $sum:1 }}},
  { $match:{ ratings:{ $gte:5}}},
  { $project:{ _id:1 }}
])

将返回看起来像这样的文件

{ "_id" : 3 }
{ "_id" : 2 }
{ "_id" : 1 }

匹配上面的示例数据。现在,有了这些,您可以在相应的集合中查找电影名称。

聚合,解剖

<强> db.movies.aggregate([

<强> ])

要查看各个阶段的作用,只需删除其后的阶段。