1

我目前正在学习 MongoDB,但遇到了一些问题。

对于一个项目,我使用的是 SQL,我有 3 个表:Artist、Album、Song。

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

在 Mongo 中,我只有一首合集 Song,其中包含所有内容:

  • 曲目名称
  • 艺术家姓名
  • 艺术品
  • 文件夹
  • 专辑名
  • 专辑日期

首先我想知道这个结构是否正确,或者我是否应该为我在 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'

所以我的问题是做我需要的最好的方法是什么?

非常感谢,瓦伦丁

4

1 回答 1

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

这里面也有一点概念上的错误。由于关系是多对多的,我猜文件夹和艺术家之间的结构只会给你艺术家匹配的第一个文件夹。还有“艺术家姓名”=> 数组('$first' => '$artistName'),我猜你喜欢拥有另一个包含艺术家姓名的字段,它与 _id 相同。在组运算符数组中,与 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))
);
于 2013-02-04T06:13:40.453 回答