2012-06-12 46 views
1

我正在尝试搜索对特定数据项进行过滤的MongoDB数据库。具体来说,我希望USA = PG-13适合我的过滤器。如何搜索按特定值过滤的MongoDB数据库

如何提出请求:获取电影,其中美国的MPAA = 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") 
    } 
    } 
} 

我想首先得到美国的ID。

$cursorCountry = $collectionCountry->find(array("en" => "USA")); 
$idCountry = $cursorCountry->getNext(); 
$_id = $idCountry["_id"]; 
$cursorMovie = $collectionMovie->find(array("movieMpaa.country" => $_id, "movieMpaa.mpaa" => "PG-13")); 

不工作! 那么如何提出请求? 要获得电影,其中美国MPAA = PG-13?

+0

'$ _id = new MongoId($ _ id)'help?无论如何,我会改变数据库@Gates VP的建议。 – Matthew

回答

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'}) 
+0

非常感谢您的回答! 这样,我会设计。 如果我们以这种方式投影数据库,将无法获得评级为PG-13的所有电影。 告诉我如何做不区分大小写的搜索? –

+0

使用正则表达式功能。从shell中可以执行'db.movi​​es.find({'movieMpaa.countries.US':/ PG-13/i}''。您需要阅读PHP中相同版本的文档。它涉及'MongoRegex'对象。 –