以下内容为MongoDB-菜鸟教程学习笔记。仅供自己学习使用。
文章目录
1、简介
MongoDB是一个由C++开发、基于分布式文件存储的数据库。旨在为web应用提供可拓展的高性能数据存储解决方案。MongoDB是一种介于关系型数据库和非关系型数据库之间的产品。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
非关系型数据库(NoSQL即not only SQL)
2、windows环境:下载、安装和本地启动
官网下载并安装即可。
·启动:
①启动服务:运行安装目录下/bin/mongod.exe
②连接mongodb:运行安装目录下/bin/mongo.exe
第二步启动成功后,即可在该窗口下进行命令操作了。
2.1 连接远程MongoDB
我是先在本地上进行学习。没有尝试远程连接。具体操作见以下:
连接远程MongoDB
3、概念解析
对照sql数据库进行理解:
4、创建与删除数据库(database)
- 创建数据库: use runoob
-如果该数据库存在,则使用该数据库。不存在,则创建。 - 查看现有的所有数据库: show dbs
-注意如果数据库中没有数据,使用该命令将看不到这个数据库。所以对于刚创建的数据库,我们需要插入一条数据库才能看到。
添加数据前
添加数据后
小结:也就是说,一个数据库只有当添加进至少一条数据后,才算是真正被创建了。
- 删除数据库:
步骤:
①切换到要删除的数据库:use runoob
【查看当前使用的数据库:db】
②执行删除命令: db.dropDatabase()
③查看是否删除成功: show dbs
5、创建与删除集合(collection)(*表table)
- 创建集合:
-①选择数据库: use runoob
-②创建集合: db.createCollection(“book”)
可选参数:
-③查看表: show tables或show collections
注释:当你向指定表插入数据时,如果那个表不存在,则会自动创建一个表。
- 删除指定集合: db.book.drop()
6、插入、更新、删除、查询文档(数据)
6.1 插入文档
db.collectionName.insert({xxx:“aaa”,xxx2:“bbb”})
· 数据格式与json类似。
· 插入时,如果指定集合不存在,则会自动创建。
· 插入也可以使用db.collectionName.save() ,使用该命令,如果不指定_id其效果与insert()相同。如果指定一个存在的_id,其效果是更新指定文档。
*其他:我们还可以用【先将数据定义为一个变量,再进行插入操作】
6.2查询文档
db.collection.find(query, projection)
· query :可选,使用查询操作符指定查询条件
· projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
·查询指定集合下的所有文档: db.collection.find()
6.2.1 条件查询:(与sql对照)
AND条件查询
db.collectionName.find({key1:value1,key2:value2}).pretty()
OR条件查询
db.collection.find({
$or:[
{key1:value1},{key2:value2}
]
}).pretty()
*演示:
AND和OR联合使用条件查询
· 与如下SQL类似:where price = “5$” and (name = “老人与海” or name = “Java SE”)
6.3 更新文档
db.collectionName.update(
<query>,
<update>,
{
upsert:<boolean>,
multi:<boolean>,
writeConcern:<document>
}
)
- query: update的查询条件,类似sql 的update中where后边的条件。
- update: update的对象和一些操作符( , , ,set…)等,可以理解为sql update的set后面的内容。
- upset: 可选。这个参数的意思是,如果要更新的数据不存在时,是否插入这条数据。true为插入,默认为false不插入。
- multi: 可选。mongodb默认是false,只更新找到的第一条数据。如果ture则更新条件匹配的所有数据。
- writeConcern: 可选。抛出异常的级别。
演示:
*其他: 上边说过还可以使用db.collection.save() 来进行更新。
注意:这种方法必须同时指定所有字段内容,否则没有指定的字段将消失。
6.4 删除文档
db.collection.remove(
<query>,
{
justOne:<boolean>,
writeConcern:<document>
}
)
- query:(可选)。删除文档的条件。
- justOne:(可选)。使用ture或1,则删除匹配的第一个文档。默认值false,则删除所有与条件匹配的文档。
- writeConcern:(可选)。抛出异常的级别。
*以上三个可选参数都不写时,表示删除该collection下的所有文档:db.collection.remove({})
6.5 $type 操作符
按照集合内的字段类型进行查询:
----查询name字段为字符串类型的。
db.collection.find({"name":{"type":2}})
或
db.collection.find({"name":{"type":"string"}})
*演示:
6.6 Limit与Skip方法
limit():用于读取指定数量的符合条件的数据
db.collection.find().limit(2) //最多显示两条符合条件的数据
skip():跳过指定数量的符合条件的数据
db.collection.find().limit(2).skip(1)
//读取两条,跳过第一条(即如果查出两条,只显示第二条)
注释:默认为skip(0)
6.7 sort()方法
利用sort()方法对查询结果进行排序:指定排序的字段 :使用1升序排序 / -1降序排序。
db.collection.find().sort({key:1/-1})
小提示:skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
6.8 索引的创建
索引能够大幅度提交查询效率:
db.collection.createIndex({key:1 / -1},{options})
1:升序创建索引
-1:降序创建索引
6.9聚合操作
对查询结果分组并统计数量
以上类似sql语句:select name,count(*) from book order by name;
更多的聚合操作表达式:
7.0 为database设置账号、密码和角色权限
安装好mongoDB后,可以不登陆直接使用数据库。不安全,建议为自己的数据库设置密码。
①切换到要设置的数据库
②为当前使用的数据库设置账号、密码和角色权限:
设置完成。
**以下为角色权限详情:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
backup,retore:在进行备份、恢复时可以单独指定的角色,在db.createUser()方法中roles里面的db必须写成是admin库,要不然会 报错
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限,
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
7.1 java连接mongoDB
-①添加依赖:
<!-- mongo 依赖 -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.11.2</version>
</dependency>
-②连接mongo(无账号密码)
package com.mongo_test.demo;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
/**
* @Author: tongys
* @Date: 2019/11/20
*/
public class Mongo_test {
public static void main(String[] args) {
//连接到mongodb服务
MongoClient mongoClient = new MongoClient("localhost",27017);
//连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("runoob");
System.out.println("connect successfully");
}
}
-③连接mongo(有账号密码)
import java.util.ArrayList;
import java.util.List;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase;
public class MongoDBJDBC {
public static void main(String[] args){
try {
//连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址
//ServerAddress()两个参数分别为 服务器地址 和 端口
ServerAddress serverAddress = new ServerAddress("localhost",27017);
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);
//MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential);
//通过连接认证获取MongoDB连接
MongoClient mongoClient = new MongoClient(addrs,credentials);
//连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");
System.out.println("Connect to database successfully");
} catch (Exception e) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
}
}
-④增删改查
package com.mongo_test.demo;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @Author: tongys
* @Date: 2019/11/20
*/
public class Mongo_test {
public static void main(String[] args) {
//连接到mongodb服务
MongoClient mongoClient = new MongoClient("localhost",27017);
//连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("runoob");
System.out.println("connect successfully");
//创建集合
mongoDatabase.createCollection("col_user");
//获取集合
MongoCollection<Document> collection = mongoDatabase.getCollection("book");//返回数据为bson格式
//向集合中插入文档
Document document = new Document();
document.append("name","Fate/go");
document.append("author","china-bil");
document.append("price","11$");
List<Document> list = new ArrayList<>();
list.add(document);
collection.insertMany(list);
//检索所有文档
FindIterable<Document> documents = collection.find();
MongoCursor<Document> mongoCursor = documents.iterator();
while (mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
//更新文档 [将author为china-bil的文档的price更新为20$]
collection.updateMany(Filters.eq("author","china-bil"),new Document("$set",new Document("price","20$")));
//删除文档
collection.deleteOne(Filters.eq("name","Fate/go"));//删除第一个符合条件的文档
collection.deleteMany(Filters.eq("name","Fate/go"));//删除所有符合条件的文档
}
}