Mongodb Mongo在多个字段上选择distinct+;通用体系结构

Mongodb Mongo在多个字段上选择distinct+;通用体系结构,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我目前正在学习MongoDB,我有一些问题 对于一个项目,我使用SQL,我有3个表:艺术家、专辑、歌曲 然后我决定换成Mongo,因为我有很多行,也因为我很好奇 在Mongo,我只有一首包含所有内容的精选歌曲: 轨迹名 艺人姓名 艺术品 文件夹 专辑名 相册日期 首先,我想知道这个结构是否正确,或者是否应该为SQL中的每个表在集合上创建? 我的主要目标是能够搜索artistName=“something”和trackName=“something”。。。通过一个简单的查找,它的工作速度非常快

我目前正在学习MongoDB,我有一些问题

对于一个项目,我使用SQL,我有3个表:艺术家、专辑、歌曲

然后我决定换成Mongo,因为我有很多行,也因为我很好奇

在Mongo,我只有一首包含所有内容的精选歌曲:

  • 轨迹名
  • 艺人姓名
  • 艺术品
  • 文件夹
  • 专辑名
  • 相册日期
首先,我想知道这个结构是否正确,或者是否应该为SQL中的每个表在集合上创建? 我的主要目标是能够搜索artistName=“something”和trackName=“something”。。。通过一个简单的查找,它的工作速度非常快!:)

但是,我还需要一个页面来显示所有艺术家及其链接(文件夹),这是我的问题: 我想显示所有艺术家,按艺术家姓名排序,以A开头(例如),并获取每个艺术家的文件夹

我试过这个:

$cursor =$collection->distinct("artistName", array( "artistName" => $regex));
$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);
这很好,但我需要
文件夹

然后我试了一下:

$cursor =$collection->distinct("artistName", array( "artistName" => $regex));
$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

结构很好,在这种情况下,简单是一件好事。您可以查看如何在mongodb中设计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 operators数组中,与gourping函数键相关的_id作为SQL中的group BY字段。你可以检查一下操作

对于您的情况,我将使用:

$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))
);

结构很好,在这种情况下简单是一件好事。您可以查看如何在mongodb中设计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 operators数组中,与gourping函数键相关的_id作为SQL中的group BY字段。你可以检查一下操作

对于您的情况,我将使用:

$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))
);

非常感谢!今晚我会测试,但这应该很棒!关于艺术家和文件夹,实际上在我的系统中,我有一个艺术家的唯一文件夹,这个文件夹就像艺术家的钥匙。。。所以我不知道这是否符合你的答案,所以我今晚会检查。。。无论如何,非常感谢!我刚刚检查了您的解决方案,两个方案都适用于我的情况!;)解决了!:谢谢你!今晚我会测试,但这应该很棒!关于艺术家和文件夹,实际上在我的系统中,我有一个艺术家的唯一文件夹,这个文件夹就像艺术家的钥匙。。。所以我不知道这是否符合你的答案,所以我今晚会检查。。。无论如何,非常感谢!我刚刚检查了您的解决方案,两个方案都适用于我的情况!;)解决了!:D