我正在尝试搜索特定数据项的MongoDB数据库过滤。具体来说,我想要USA = PG-13作为我的过滤器。
如何提出要求:获取电影,MPAA for USA = PG-13?
收集国家/地区:
{
"_id": ObjectId("4fd79ec34c9fda9d05000080"),
"en": "USA"
}
{
"_id": ObjectId("4fd79ec34c9fda9d0500007f"),
"en": "Hong Kong"
}
收集电影:
{
"_id": ObjectId("4fd79ec34c9fda9d05000081"),
"movieId": {
"imdb": "0848228"
},
"movieTitle": "The Avengers",
"movieYearSpan": {
"start": "2012",
"end": "2012"
},
"movieType": "Movie",
"movieMpaa": {
"verdict": "Rated PG-13",
"0": {
"mpaa": "IIA",
"country": ObjectId("4fd79ec34c9fda9d0500007f")
},
"1": {
"mpaa": "PG-13",
"country": ObjectId("4fd79ec34c9fda9d05000080")
}
}
}
我试图先获得美国的身份证。
$cursorCountry = $collectionCountry->find(array("en" => "USA"));
$idCountry = $cursorCountry->getNext();
$_id = $idCountry["_id"];
$cursorMovie = $collectionMovie->find(array("movieMpaa.country" => $_id, "movieMpaa.mpaa" => "PG-13"));
不起作用! 那怎么提出要求呢? 要获得电影,MPAA for USA = PG-13?
答案 0 :(得分:1)
正如您的数据布局一样,这里没有好的查询。
如果您可以将movies
集合更改为以下内容,那么您的查询将有效:
"movieMpaa": {
"verdict": "Rated PG-13",
"countries": [
{
"mpaa": "IIA",
"country": ObjectId("4fd79ec34c9fda9d0500007f")
},
{
"mpaa": "PG-13",
"country": ObjectId("4fd79ec34c9fda9d05000080")
}
]
当movieMpaa.countries
是一个对象数组时,您可以查询该数组中的movieMpaa.countries.country
。 MongoDB将识别数组并“钻入”对象。
然而,还有另一种结构方式可能更容易长期使用:
"movieMpaa": {
"verdict": "Rated PG-13",
"countries": {
ObjectId("4fd79ec34c9fda9d0500007f") : { "mpaa": "IIA" },
ObjectId("4fd79ec34c9fda9d05000080") : { "mpaa": "PG-13" }
}
如果一个国家/地区只能有一个评级,那么从技术上讲countries
值是Countries => ratings
的字典。上面的结构以这种方式存储它们。
然而,使用ObjectId
在那里有点难看。请注意,您可以覆盖country
集合中的ID。请考虑使用2或3个字符的ISO代码。这些更容易阅读。
"movieMpaa": {
"verdict": "Rated PG-13",
"countries": {
"UK" : { "mpaa": "IIA" },
"US" : { "mpaa": "PG-13" }
}
db.movies.find({'movieMpaa.countries.US': 'PG-13'})