我目前正在学习MongoDB,但我遇到了一些问题。
对于一个项目,我使用的是SQL,我有3个表:Artist,Album,Song。
然后我决定换到Mongo,因为我有很多行,也因为我很好奇......
在Mongo中,我只有一首歌集,其中包含所有内容:
首先,我想知道这个结构是否正确,或者我是否应该为SQL中的每个表创建集合? 我的主要目标是能够搜索artistName =“something”和trackName =“something_else”...通过简单的查找,它的工作速度非常快! :)
但是我还需要一个页面来显示所有艺术家的链接(文件夹),这是我的问题: 我想显示所有艺术家,按艺术家名称排序,以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'
所以我的问题是,做我需要的最好的方法是什么?
非常感谢, 的Valentin
答案 0 :(得分:1)
结构很好,在这种情况下简单是件好事。你可以查看教程如何在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”=>数组('$ first'=>'$ artistName'),我希望你想要有另一个包含artistName的字段,它与_id相同。在group运算符数组中,_id与gourping函数的键相关,作为SQL中的GROUP BY字段。您可以查看操作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))
);