MongoDB学习笔记

以下内容为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"));//删除所有符合条件的文档



        
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值