如何搜索由特定值过滤的MongoDB数据库

时间:2012-06-12 23:25:01

标签: php regex search mongodb find

我正在尝试搜索特定数据项的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?

1 个答案:

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