2012-06-12 80 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'對象。 –