我正在尝试抓住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的电影标题的查询?谢谢。
答案 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([
强>
{ $unwind:"$movies"},
:数组内容也无法直接以对我们有帮助的方式进行检查,因此我们需要解构数组。对于每个数组项,基本上都会复制父文档。{ $group:{ _id:"$movies.movie", ratings:{ $sum:1 }}},
:每次找到特定的电影时,我们都会增加计数器 ratings
。因此,每次为特定电影找到电影评级时,计数器都会递增。{ $match:{ ratings:{ $gte:5}}},
:我们只想要评分至少5次的文档{ $project:{ _id:1 }}
:最后但并非最不重要的是,由于我们只需要电影的ID,我们会删除其他所有内容。 <强> ])
强>
要查看各个阶段的作用,只需删除其后的阶段。