49. [MongoDB]MongoDB基本查询

49.1. 说在前面

与初学不同,下面着重将aggregate查询操作,实现简单的noSQL查询。

MongoDB为一个被广泛使用非结构化数据库,查询速度快效率高,由于是非结构化,就不能使用SQL去自由查询,需要学习MongoDB特有的查询语法。

49.2. 操练起来

49.2.1. 简单查询

TODO: 待补充

49.2.2. 高级查询

为了学习MongoDB的基本查询语法,带着疑问学习,下面从基础开始一步一步得到一条类似于SQL中:

SELECT year,COUNT(1) AS total
FROM (
SELECT *
FROM cars
WHERE brand_id > 1000 AND brand_id < 2000
LIMIT 100
) AS a
GROUP BY year

上面在SQL中为一个较为简单却复杂(哟,这句话带一点哲理在里面)的聚合查询,需要使用MongoDB的aggregate去聚合查询。

Aggregate操作将MongoDB的文档经一个管道处理完之后数据输出到下一个管道,再由下一个管道进行处理

想要实现上述SQL实现的功能的MongoDB的查询语句为:

db.getCollection('cars').aggregate([
    {
        $match: 
        {
            brand_id: {
                $gt: 1000,
                $lt: 2000
            }
        }
    },
    {
        $limit: 100
    },
    {
        $group: 
        {
            _id: {
                year: '$years'
            },
            total: {
                $sum: 1
            }
        }
    }
]);

如下图,我们将该语句拆开来看

aQuery

上面的db.getCollection('cars').aggregate()为固定写法,内含有三个管道A、B、C,在执行时,A处理完的数据输出到B被B执行,B执行完得到的数据输出到C被C处理。

  • 1、在管道A中,匹配brand_id大于1000并且小于2000的所有数据,对应于SQL语句WHERE brand_id > 1000 AND brand_id < 2000

  • 2、经1得到数据输出到管道B,将数据随机筛选得到100条

  • 3、经2得到的数据进入管道C,在C中,数据被根据字段years分组,并且命别名为year,每取到一个值就被加1,得到的累计数值被命别名为total。($years为取字段years的值,目的为了分组,$sum为求和操作)

以上输出的结果为:

image-20220303230454190

实际形式为:

// 1
{
    "_id": {
        "year": "2007"
    },
    "total": 1
}

// 2
{
    "_id": {
        "year": "2005"
    },
    "total": 1
}

// 3
{
    "_id": {
        "year": "2018"
    },
    "total": 3
}

// 4
{
    "_id": {
        "year": "2008"
    },
    "total": 3
}

// 5
{
    "_id": {
        "year": "2014"
    },
    "total": 13
}

// 6
{
    "_id": {
        "year": "2009"
    },
    "total": 1
}

// 7
{
    "_id": {
        "year": "2016"
    },
    "total": 8
}

// 8
{
    "_id": {
        "year": "2012"
    },
    "total": 9
}

// 9
{
    "_id": {
        "year": "2017"
    },
    "total": 11
}

// 10
{
    "_id": {
        "year": "2004"
    },
    "total": 5
}

// 11
{
    "_id": {
        "year": "2015"
    },
    "total": 12
}

// 12
{
    "_id": {
        "year": "2013"
    },
    "total": 24
}

// 13
{
    "_id": {
        "year": "2011"
    },
    "total": 4
}

// 14
{
    "_id": {
        "year": "2019"
    },
    "total": 4
}

// 15
{
    "_id": {
        "year": "2010"
    },
    "total": 1
}