2013-02-03 28 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