mongodb指令查询手册
前景提要
最近,公司在写一个项目,项目主要使用的是非关系型数据库mongodb。之前非关系型数据库只用过redis。无奈,只好恶补mongodb相关的知识了。
mongodb简介
百度上, 对mongodb的定义是这样的:
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
上面这段话其实能归纳总结为以下几点:
1. 是最像关系型数据库的非关系型数据库
2. 数据格式以类似json的格式储存,可以存储比较复杂的数据类型。
3. 实现了类似关系型数据库单表查询的绝大多数功能,还支持建立索引,查询功能强大!
上面说过,Mongodb是很像关系型数据库的非关系型数据库,所以我们在学习的过程中,可以对比关系型数据库来方便我们对mongodbde的理解。菜鸟教程上有个两者的对照图,可以帮助我们理解mongodb的一些概念:
下面,我们将通过这张图,来简单介绍mongodb一些基本的操作指令,因为我本身对mongodb也不够熟悉,有什么说错的地方,欢迎大家指正。
另外,我使用的mongodb版本是4.4.12,mongodb的安装这里我就不多说了,大家自行去百度,网上的教程有很多。
mongodb指令介绍
1. 数据库连接
找到mongodb安装目录,进入bin
目录下,执行如下指令:
mongo --port 27017
示例:
C:\xxxxxx\mongodb\bin>mongo --port 27017
MongoDB shell version v4.4.12
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("5beaed38-4bcf-4d8f-a827-9f4c27958088") }
MongoDB server version: 4.4.12
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
https://docs.mongodb.com/
Questions? Try the MongoDB Developer Community Forums
https://community.mongodb.com
---
The server generated these startup warnings when booting:
2022-02-24T09:07:58.969+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
---
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
2.版本查看
语句:
db.version();
查询结果:
3.数据库相关操作
使用/新增数据库
语法:
use DATABASE_NAME;
使用该语句时,如果数据库不存在,则会创建数据库,如果存在,直接切换至对应数据库
> use test_db;
switched to db test_db
此时,我们发现已经成功切换至刚新建的数据库test_db
。
数据库查询
语法:
// 通过该条语句,可以查看到我们当前连接的mongodb所包含的数据库列表
show dbs;
在上面,我们使用了use test_db
创建了一个一个名为test_db
的数据库,现在,我们使用show dbs;
来查询,看看我们刚刚创建的数据库是否存在。
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
咦?我们刚刚创建的数据库去哪了?之前明明已经显示切换至test_db
了啊?
在mongodb中,只有存在数据的数据库才会显示出来。 现在我们向test_db库中插入一条记录!
> db.table1.insert({"name":"烽火戏诸侯"})); # 表示在test_db新建一个名为table1的集合,往集合中插入一条数据!
WriteResult({ "nInserted" : 1 })
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
test_db 0.000GB
> show tables; # 查询表中集合指令,类似于sql中的show tables;指令
table1
当数据库中存在数据时,再次查看所有数据库,我们发现刚刚创建的test_db
库就能查询到了!
数据库删除
语法:
## 第一步:使用use切换至指定数据库
use DATABASE_NAME;
## 第二步:执行如下命令删除数据库
db.dropDatabase();
示例:
> use test_db; # 切换至mongodb
switched to db test_db
> db.dropDatabase(); # 数据库删除
{ "dropped" : "test_db", "ok" : 1 }
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
4.集合的创建与删除
集合创建
语法:
db.createCollection(name, options);
参数说明:
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
示例:
> use test_db;
switched to db test_db
> db.createCollection("table1"); # 创建一个名为table1的集合
{ "ok" : 1 }
> show collections; # 显示所有集合
table1
> show tables; # 显示所有集合
table1
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
示例:
> show collections;
table1
> db.table2.insert({"name":"卧龙戏公瑾"}); # 执行该语句,会自动创建名为table2的集合
WriteResult({ "nInserted" : 1 })
> show collections;
table1
table2
集合查看
语法:
show tables;
show collections;
## 以上两种方式均可
示例:
> show tables;
table1
> show collections;
table1
集合删除
语法:
db.collection_name.drop(); # collection_name表示需要删除的集合名
示例:
> show tables;
table1
table2
> db.table2.drop();
true
> show tables;
table1
5.文档相关操作
文档新增
语法简介:
db.COLLECTION_NAME.insert(document);
db.COLLECTION_NAME.save(document);
- save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
- insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。
db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
参数说明:
- document:要写入的文档。
- writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
- ordered:指定是否按顺序写入,默认 true,按顺序写入。
insert示例:
> db.books.insert({
"title":"mongodb从入门到放弃",
"description":"测试",
"by":"xdw",
"tags":["mongodb","nosql"],
"likes":100
}); # 向books集合中插入文档
WriteResult({ "nInserted" : 1 })
> db.books.find(); # 查询books集合中所有的数据
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "mongodb从入门到放弃", "description" : "测试", "by" : "xdw", "tags" : [ "mongodb", "nosql" ], "likes" : 100 }
insertOne示例:
> db.books.insertOne({
... title:"测试01",
... description:"测试01描述",
... by:"aa",
... tags:["测试","01"],
... likes:1
... }); # 插入一条数据
{
"acknowledged" : true,
"insertedId" : ObjectId("6218344259154dea11d01b04")
}
> db.books.find();
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "mongodb从入门到放弃", "description" : "测试", "by" : "xdw", "tags" : [ "mongodb", "nosql" ], "likes" : 100 }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000 }
{ "_id" : ObjectId("6218344259154dea11d01b04"), "titile" : "测试01", "description" : "测试01描述", "by" : "aa", "tags" : [ "测试", "01" ], "likes" : 1 }
insertMany示例:
> db.books.insertMany([
... {
... title:"测试02",
... description:"测试02描述",
... by:"bb",
... tags:["测试","02"],
... likes:2
... },
... {
... title:"测试03",
... description:"测试03描述",
... by:"cc",
... tags:["测试","03"],
... likes:2
... },
... ]);
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("621834f259154dea11d01b05"),
ObjectId("621834f259154dea11d01b06")
]
}
> db.books.find();
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "mongodb从入门到放弃", "description" : "测试", "by" : "xdw", "tags" : [ "mongodb", "nosql" ], "likes" : 100 }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000 }
{ "_id" : ObjectId("6218344259154dea11d01b04"), "titile" : "测试01", "description" : "测试01描述", "by" : "aa", "tags" : [ "测试", "01" ], "likes" : 1 }
{ "_id" : ObjectId("621834f259154dea11d01b05"), "titile" : "测试02", "description" : "测试02描述", "by" : "bb", "tags" : [ "测试", "02" ], "likes" : 2 }
{ "_id" : ObjectId("621834f259154dea11d01b06"), "titile" : "测试03", "description" : "测试03描述", "by" : "cc", "tags" : [ "测试", "03" ], "likes" : 2 }
文档更新
方式一:通过update方法
语法:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
);
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
示例:
> db.books.find();
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "mongodb从入门到放弃", "description" : "测试", "by" : "xdw", "tags" : [ "mongodb", "nosql" ], "likes" : 100, "titile" : null }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
{ "_id" : ObjectId("6218344259154dea11d01b04"), "titile" : null, "description" : "测试01描述", "by" : "aa", "tags" : [ "测试", "01" ], "likes" : 1, "title" : "测试01" }
{ "_id" : ObjectId("621834f259154dea11d01b05"), "titile" : null, "description" : "测试02描述", "by" : "bb", "tags" : [ "测试", "02" ], "likes" : 2, "title" : "测试02" }
{ "_id" : ObjectId("621834f259154dea11d01b06"), "titile" : null, "description" : "测试03描述", "by" : "cc", "tags" : [ "测试", "03" ], "likes" : 2, "title" : "测试03" }
> db.books.update({title:"测试02"}, {$set:{title:"测试02修改"}}); # 将title为测试02的记录的title改为测试02修改
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.books.find(); "}});
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "mongodb从入门到放弃", "description" : "测试", "by" : "xdw", "tags" : [ "mongodb", "nosql" ], "likes" : 100, "titile" : null }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
{ "_id" : ObjectId("6218344259154dea11d01b04"), "titile" : null, "description" : "测试01描述", "by" : "aa", "tags" : [ "测试", "01" ], "likes" : 1, "title" : "测试01" }
{ "_id" : ObjectId("621834f259154dea11d01b05"), "titile" : null, "description" : "测试02描述", "by" : "bb", "tags" : [ "测试", "02" ], "likes" : 2, "title" : "测试02修改" }
{ "_id" : ObjectId("621834f259154dea11d01b06"), "titile" : null, "description" : "测试03描述", "by" : "cc", "tags" : [ "测试", "03" ], "likes" : 2, "title" : "测试03" }
方式二:通过save()方法(不常用,已经过时)
save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。语法格式如下:
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
参数说明:
- document : 文档数据。
- writeConcern :可选,抛出异常的级别。
示例:
> db.books.find();
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "mongodb从入门到放弃", "description" : "测试", "by" : "xdw", "tags" : [ "mongodb", "nosql" ], "likes" : 100, "titile" : null }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
{ "_id" : ObjectId("6218344259154dea11d01b04"), "titile" : null, "description" : "测试01描述", "by" : "aa", "tags" : [ "测试", "01" ], "likes" : 1, "title" : "测试01" }
{ "_id" : ObjectId("621834f259154dea11d01b05"), "titile" : null, "description" : "测试02描述", "by" : "bb", "tags" : [ "测试", "02" ], "likes" : 2, "title" : "测试02修改" }
{ "_id" : ObjectId("621834f259154dea11d01b06"), "titile" : null, "description" : "测试03描述", "by" : "cc", "tags" : [ "测试", "03" ], "likes" : 2, "title" : "测试03" }
> db.books.save({
... "_id" : ObjectId("62175e8681fa52a64b722274"),
... "title" : "MongoDB",
... "description" : "MongoDB 是一个 Nosql 数据库",
... "by" : "xdw",
... "url" : "http://www.runoob.com",
... "tags" : [
... "mongodb",
... "NoSQL"
... ],
... "likes" : 110
... });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.books.find();
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
{ "_id" : ObjectId("6218344259154dea11d01b04"), "titile" : null, "description" : "测试01描述", "by" : "aa", "tags" : [ "测试", "01" ], "likes" : 1, "title" : "测试01" }
{ "_id" : ObjectId("621834f259154dea11d01b05"), "titile" : null, "description" : "测试02描述", "by" : "bb", "tags" : [ "测试", "02" ], "likes" : 2, "title" : "测试02修改" }
{ "_id" : ObjectId("621834f259154dea11d01b06"), "titile" : null, "description" : "测试03描述", "by" : "cc", "tags" : [ "测试", "03" ], "likes" : 2, "title" : "测试03" }
文档删除
语法:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别。
示例:
> db.books.remove({title:"测试01"}); #删除名称为测试01的数据
WriteResult({ "nRemoved" : 1 })
> db.books.find();
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
{ "_id" : ObjectId("621834f259154dea11d01b05"), "titile" : null, "description" : "测试02描述", "by" : "bb", "tags" : [ "测试", "02" ], "likes" : 2, "title" : "测试02修改" }
{ "_id" : ObjectId("621834f259154dea11d01b06"), "titile" : null, "description" : "测试03描述", "by" : "cc", "tags" : [ "测试", "03" ], "likes" : 2, "title" : "测试03" }
文档查询
MongoDB 查询数据的语法格式如下:
db.collection.find(query, projection);
参数说明:
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.col.find().pretty()
pretty() 方法以格式化的方式来显示所有文档。
示例:
> db.books.find();
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
> db.books.find().pretty();
{
"_id" : ObjectId("62175e8681fa52a64b722274"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "xdw",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
}
{
"_id" : ObjectId("62175ff1a038000008007803"),
"title" : "java 教程",
"description" : "java10天入门",
"by" : "xdw",
"url" : "http://www.runoob.com",
"tags" : [
"java",
"javaweb",
"spring"
],
"likes" : 1000,
"titile" : null
}
MongoDB 与 关系型数据库 Where 语句比较:
MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法:
db.col.find({key1:value1, key2:value2}).pretty();
示例:
> db.books.find({
... "title":"java 教程",
... "by":"xdw"
... }); # 查询title是java 教程并且作者是xdw的文档
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
MongoDB OR条件:
语法:
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty();
示例:
> db.books.find({
... $or:[{"title":"java"},{"by":"xdw"}]
... });
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
AND 和 OR 联合使用:
示例:
> db.books.find({
... "likes":{$gt:200},
... $or:[
... {
... "by":"xdw"
... },
... {
... "title":"MongoDB"
... }
... ]
... });
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
$type的使用:
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 | |
JavaScript | 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 |
示例:
> db.books.find({
... "title":{$type:2}
... }); # 查询title为字符串的数据
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
> db.books.find({ "title":{$type:"string"} }); # 查询title为字符串的数据
{ "_id" : ObjectId("62175e8681fa52a64b722274"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 }
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
>
分页操作limit与skip:
语法:
db.COLLECTION_NAME.find().limit(NUMBER); # limit设置查询最大天数
db.COLLECTION_NAME.find().skip(NUMBER); # 设置跳过的记录数
示例:
> db.books.find().limit(2).skip(1);
{ "_id" : ObjectId("62175ff1a038000008007803"), "title" : "java 教程", "description" : "java10天入门", "by" : "xdw", "url" : "http://www.runoob.com", "tags" : [ "java", "javaweb", "spring" ], "likes" : 1000, "titile" : null }
排序:
语法:
db.COLLECTION_NAME.find().sort({KEY:1})
说明:
- KEY表示列名
- 1表示正序,-1表示倒叙
示例:
> db.books.find().sort({"likes":-1}).pretty();
{
"_id" : ObjectId("62175ff1a038000008007803"),
"title" : "java 教程",
"description" : "java10天入门",
"by" : "xdw",
"url" : "http://www.runoob.com",
"tags" : [
"java",
"javaweb",
"spring"
],
"likes" : 1000,
"titile" : null
}
{
"_id" : ObjectId("62175e8681fa52a64b722274"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "xdw",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
}
索引创建
db.collection.createIndex({keys, options});
语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
示例:
> db.books.createIndex({"title":1});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.books.getIndexes();
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"title" : 1
},
"name" : "title_1"
}
]
也可以同时创建多个索引,类似于关系型数据库的符合索引,示例如下:
db.col.createIndex({"title":1,"description":-1});
createIndex() 接收可选参数,可选参数列表如下:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
示例:
db.values.createIndex({open: 1, close: 1}, {background: true});
说明:通过在创建索引时加 background:true 的选项,让创建工作在后台执行
聚合查询
语法:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION);
示例:
> db.books.aggregate([
... {
... $group: {
... _id:"$by",
... totalCount: {$sum:"$likes"}
... }
... }
... ]);
{ "_id" : "xdw", "totalCount" : 1110 }
mongodb提供了很多聚合函数,如下:
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 将值加入一个数组中,不会判断是否有重复的值。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
简而言之,就是aggregate方法可以跟多个操作!
这里我们介绍一下聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
示例:
> db.books.aggregate([
... {
... $project : {
... title : "$title" ,
... author : "$by" ,
... likes:1
... }
... },
... {
... $match:{
... likes:{$gte:200}
... }
... }
... ]);
{ "_id" : ObjectId("62175ff1a038000008007803"), "likes" : 1000, "title" : "java 教程", "author" : "xdw" }
以上案例的作用是查询出likes大于等于200的记录,再将查出来的字段起别名!
mongodb的介绍就此结束,本文参考的是mongodb菜鸟教程,如有什么不正确的地方,欢迎大家指正!