2013-02-03 39 views
1

我目前正在學習MongoDB,我有一些問題。Mongo選擇不同的多個字段+通用體系結構

對於一個項目,我使用SQL,我有3個表格:Artist,Album,Song。

於是我決定改變到蒙戈,因爲我有很多行,也因爲我很好奇......

在蒙戈,我只有一個收集歌曲與它的一切:

  • TRACKNAME
  • ARTISTNAME
  • 藝術品
  • ALBUMNAME
  • albumDate

首先,我想知道,如果這個結構是正確的,或者我應該集合,我不得不在SQL每個表中創建? 我的主要目標是能夠搜索artistName =「something」和trackName =「something_else」...通過簡單的查找,它的工作非常快! :)

但是我還需要一個頁面來顯示所有藝術家的鏈接(文件夾),這裏是我的問題: 我想顯示所有藝術家,按artistName排序,以A開頭(例如)和得到的文件夾,每個藝術家......

我嘗試這樣做:

$cursor =$collection->distinct("artistName", array("artistName" => $regex)); 

工作正常,但我需要的folder ..

然後我嘗試這樣的:

$ops = array(
    array(
     '$project' => array(
      "artistName" => 1, 
      "folder" => 1, 
     ) 
    ), 
    array('$match' => array("artistName" => $regex)), 
    array('$group' => array(
         '_id'=>'$artistName', 
         "artistName" => array('$first' => '$artistName'), 
         "folder" => array('$first' => '$folder') 
         ), 
    array('$sort' => array('artistName'=>-1)), 
    ) 
); 

$results = $collection->aggregate($ops); 

,沒有排序,但與那種我有以下錯誤的原理:

Pipeline::run(): unrecognized pipeline op "0' 

所以我的問題是什麼做什麼,我需要最好的方法是什麼?

非常感謝, 瓦倫丁

回答

1

結構是好的,在這種情況下,簡單是一個很好的thing.you可以檢查教程如何在MongoDB中here設計DM。對於您寫的提議,我會選擇聚合框架,並且在您編寫的語法中存在導致問題的錯誤,您在$ groups數組的括號內編寫了$ sort。試試這個:

$ops = array(
    array('$project' => array(
          "artistName" => 1, 
          "folder" => 1, 
         ) 
     ), 
    array('$match' => array("artistName" => $regex)), 
    array('$group' => array(
         '_id'=>'$artistName', 
         "artistName" => array('$first' => '$artistName'), 
         "folder" => array('$first' => '$folder') 
         ) 
     ), 
    array('$sort' => array('artistName'=>-1)) 
    ); 

它也有一個小概念錯誤。由於我認爲文件夾和藝術家之間的關係有很多很多,所以結構只會給你第一個與藝術家相匹配的文件夾。也是「artistName」=> array('$ first'=>'$ artistName'),這個我猜你喜歡擁有另一個包含artistName的字段,它與_id是一樣的。在組運算符中,將與作爲SQL中的GROUP BY字段的gourping函數的鍵相關的_id數組。您可以檢查操作here

對於你的情況我會用:

$ops = array(
    array('$match' => array("artistName" => $regex)), 
    array(
     '$project' => array(
      "artistName" => 1, 
      "folder" => 1, 
     ) 
    ), 
    array('$group' => array(
         '_id'=>array('artistName' => '$artistName', 
            'folder' => '$folder') 
         )), 
    array(
     '$project' => array(
      "_id" => 0, 
      "artistName" => '$_id.artistName', 
      "folder" => '$_id.folder', 
     ) 
    ), 
    array('$sort' => array('artistName'=>-1)) 
); 
+0

真的謝謝了!我今晚會測試,但這應該很棒! 關於藝術家和文件夾,實際上在我的系統中,我有一個由藝術家獨特的文件夾,文件夾就像是藝術家的鑰匙...所以我不知道這是否符合您的答案,所以我會檢查今晚。 .. 無論如何非常感謝! – ValentinH

+0

我剛剛檢查了你的解決方案,兩者都在我的案例中工作! ;) 解決! :d – ValentinH