MongoDB查询
基本语法
db.COLLECTION_NAME.find()
如果你需要以易读的方式读取数据可以使用pretty()
db.col.find().pretty()
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value>} | db.col.find({“name”:”mongoDB”}) | where name=’mongoDB’ |
小于 | {<key>:{$lt:<value>}} | db.col.find({‘lieks’:{$lt:50}}) | where likes<50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({‘lieks’:{$lt:50}}) | where likes<=50 |
大于 | {<key>:{$gt<value>}} | db.col.find({‘lieks’:{$gt:50}}) | where likes>50 |
大于等于 | {<key>:{$gte<value>}} | db.col.find({‘lieks’:{$gte:50}}) | where likes>=50 |
不等于 | {<key>:{$ne<value>}} | db.col.find({‘lieks’:{$ne:50}}) | where likes!=50 |
MongoDB AND条件
MongoDB的find()方法可以传入多个键,每个键以逗号隔开
语法如下:
db.col.find({key1:value1, key2:value2})
MongoDB OR条件
or条件语句使用了关键字$or语法格式如下
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
MongoDB OR和AND连用
db.col.find(
{
"likes": {$gt:50},
$or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]
}
)
MongoDB $type操作符
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
MongoDB中可使用的类型如下表所示:
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JaveScript | 13 | |
Symbol | 14 | |
JavaScript(with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1 |
Max key | 127 |
使用:
若果想要获取”col”结合中title为string类型的数据,可以这样写
db.col.find({'title':{$type:2}})
MongoDB Limit()方法
如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接收一个数字参数,该参数指定从MongoDB中读取的记录条数。
语法:
db.COLLECTION_NAME.find().limit(NUMBER)
如果没有指定limit()方法中的参数则默认显示全部。
MongoDB Skip()方法
Skip()方法用来跳过指定数量的数据
语法:
db.COLLECTION_NAME.skip(NUMBER)
默认参数为0
MongoDB sort()方法
在MongoDB中使用sort方法进行排序,该方法可以通过参数指定排序的字段,并使用1和-1来指定排序方式,1为升序排序,-1为降序排序
语法:
db.COLLECTION_NAME.find().sort({key:1})
MongoDB索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据的时候必须扫描集合中的每个文件并选出那些符合查询条件的查询。
索引是特殊的数据机构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的进行排序的一种结构。
创建索引的语法:
db.COLLECTION_NAME.ensureIndex({key:1})
例子:
db.col.ensureIndex({tittle:1,likes:-1})
你可以同时设置多个字段创建索引,1为升序创建索引,-1位降序创建索引
ensureIndex()还可以接受其他参数,具体参数可查询手册
例如:
db.col.ensureIndex({tittle:1,likes:-1},{background:true})
这样就可以使创建索引的工作在后台执行
MongoDB聚合
主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql中的count(*)
集合中的数据:
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'w3cschool.cc',
url: 'http://www.w3cschool.cc',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'w3cschool.cc',
url: 'http://www.w3cschool.cc',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
},
查询语句:
db.article.aggregate([
{
$group : {
_id : "$by_user",
num_tutorial : {$sum : 1}
}
}
])
类似sql中的:select by_user,count(*) from article group by by_user
聚合表达式:
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算综合 | db.article.aggregate([{$group:{_id:'$by_user',num_tutorial:{$sum:'$likes'}}}]) |
$avg | 计算平均值 | db.article.aggregate([{$group:{_id:'$by_user',num_tutorial:{$avg:'$likes'}}}]) |
$min | 获取结合中所有文档对应值的最小值 | db.article.aggregate([{$group:{_id:'$by_user',num_tutorial:{$min:'$likes'}}}]) |
$max | 获取结合中所有文档对应值的最大值 | db.article.aggregate([{$group:{_id:'$by_user',num_tutorial:{$max:'$likes'}}}]) |
$push | 在结果文档中插入值到一个数组中 | db.article.aggregate([{$group:{_id:'$by_user',url:{$push:'$url'}}}]) |
$addToSe | 在结果文档中插入值到一个数组中,但不创建副本 | db.article.aggregate([{$group:{_id:'$by_user',url:{$addToSe:'$url'}}}]) |
$first | 根据资源文档的排序获取第一个文档数据 | db.article.aggregate([{$group:{_id:'$by_user',url:{$first:'$url'}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.article.aggregate([{$group:{_id:'$by_user',url:{$last:'$url'}}}]) |
管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递个下一个管道处理。管道操作是可以重复的。表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前局和管道的文档,不能处理其他的文档。
- $project:修改输入文档的结构,可以用来重命名,增加或删除,也可以用于创建计算结果以及嵌套文档
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询。
- $limit:用来限制MongoDB聚合管道返回的文档数
- $skip:跳过指定数量的文档
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
- $group:将集合中的文档分组
- $sort:排序
- $geoNear:输出接近某一地理位置的有序文档
管道操作实例
$project
这样子结果中就只有_id,title,author三个字段了,_id默认是被包含的
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
$match
match用于获取分数大于70且小于等于90的记录,然后将符合条件的记录送到下一阶段 group管道操作符进行处理
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
$skip
过滤掉前五个文档
db.article.aggregate(
{ $skip : 5 });