mongodb学习笔记
鸣谢:菜鸟教程
1.基本概念
1.1 NOSQL
NOSQL,即not only sql,不仅仅是sql的意思,NOSQL泛指非关系型数据库。关于关系型数据库和分i关系型数据库的区别,在这里不进行阐述,大家可以自行百度。NOSQL主要分为四种类型:键值存储数据库/列存储数据库/文档型数据库/图形数据库。
1.2 MongoDB
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。MongoDB数据上述所说的文档型数据库
数据库 | 数据库 |
表 | 集合 |
行 | 文档 |
字段 | 域 |
主键 | 主键,MongoDB自动将_id字段设置为主键 |
在一个mongodb中,可以创建多个数据库,一个数据库可以包含多个集合,一个集合可以包含多个文档。
1.2.1 文档
文档是类似json格式的数据,比如:{“name”:“张三”}
1.2.2 集合
集合用于存储文档,存储的文档的结构可以相同也可以不同
例如:
{“name”:“张三”}
{“id”:“111”,”age”:”12”}
1.2.3 元数据
数据库本身的信息也是存储在集合中,可以用以下语句查看:
DBNAME.system.namespaces :列出所有名字空间
DBNAME.system.indexs :列出所有索引
DBNAME.system.profile :列出数据库概要信息
DBNAME.system.users :列出访问数据库的用户
DBNAME.system.sources :列出服务器信息
2.语法
2.1 语法
创建数据库 | use DATABASE_NAME |
use db_test |
如果数据库不存在,则创建数据库,否则切换到指定数据库 |
查看当前连接的数据库 | db |
db |
|
查看所有数据库 | show dbs |
show dbs |
对于空的数据库,mongodb不显示或者显示为dbname(empty) |
删除数据库 | db.dropDatabase() |
use db_test db.dropDatabase() |
先切换到要删除的数据库,然后删除 |
创建集合 | db.createCollection("name") |
use db_test db.createCollection("users") |
切换到数据库 创建集合 |
查看集合 | show collections |
show collections |
|
删除集合 | db.collection_name.drop() |
db.users.drop() |
|
向集合中插入文档 | db.collection_name .insert(document) |
db.users.insert([ { name : "Tom",sex: "boy", age:"24" },{ name : "Mary", sex: "girl", age:"23" }) |
文档中的key不需要引号 不指定_id 会自动为_id赋值 |
向集合中插入文档 | db.collection_name .save(document) |
db.users.save([{ name : "Tom", sex: "boy", age:"24"},{ name : "Mary",sex: "girl",age:"23"}]) |
与insert方法一样 疑问:网上说指定_id时,使用save可以更新,但实际上会报错 |
简单查询 | db.collection.find() |
db.users.find() |
|
以易读的方式查询 | db.collection.find().pretty() |
db.users.find().pretty() |
|
查询:等于 | {“key”:“value”} |
`db.users.find({"name":"Tom"}) |
where name = “Tom” |
查询:不等于 | {“key”:{$ne:value} |
db.users.find({"age":{$ne:23}}) |
where age!=23 |
查询:大于 | {“key”:{$gt:value}} |
db.users.find({"age":{$gt:23}}) |
where age>23 |
查询:小于 | {“key”:{$lt:value}} |
db.users.find({"age":{$lt:23}}) |
where age<23 |
查询:大于等于 | {“key”:{$gte:value}} |
db.users.find({"age":{$gte:23}}) |
where age>=23 |
查询:小于等于 | {“key”:{$lte:value}} |
db.users.find({"age":{$lte:23}}) |
where age<=23 |
查询:AND | {"key1":"value1","key2":"value2"} |
db.users.find({"name":"Tom","sex":"boy"}) |
where name=”Tom” and sex=”boy” |
查询:OR | {$or:[{"key1":"vaule1" },{"key2":"value2" }]} |
db.users.find({$or:[{"age":"24",{"age":"25"}}]}) |
where (age = 24 or age = 25) |
查询:AND 与OR组合 | db.users.find({"sex":"boy",{$or:[{"age":"24",{"age":"25"}}]} }) |
where sex=”boy” and (age = 24 or age = 25) | |
更新文档 |
db.collection.update( <query>, <update>, { upsert: <boolean>,multi: <boolean>, writeConcern: <document>
|
实例1:db.users .update( {"name":"Tom"}, {$set:{"name":"Tony"}} ) 实例2: db.users .update( {"name":"Tom"}, {$set:{"name":"Tony"}}, { multi:true } )
|
query:过滤条件 update:修改操作 upsert:若更新的数据不存在,是否插入,默认为false(可选) multi:是否全部更新,默认为false即只更新查询到的第一条(可选) writeConcern:抛出异常的级别(可选) 实例1与实例2相当于: update users set name = “Tony” where name = “Tom” 实例1只修改一条,实例二会修改所以符合条件的数据 |
删除文档 | 2.6之前:db.collection.remove( <query>, <justOne> ) 2.6之后: db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
|
实例1:db.users.remove( {"name":"Tony"} ) 实例2: db.users.remove( {"name":"Tony"}, { justOne:true } )
|
|
清空集合 | db.collection.remove() |
db.users.remove() |
删除集合中的所有文档 |
查询:$type操作符 | db.collection.find("key":{$type:type}) |
db.users.find("name":{$type:2}) |
左侧实例为查询name为String的数据 【具体映射关系见2.2】 |
查询:limit | db.collection.find().limit(NUMBER) |
`db.users.find().limit(2) |
查询两条数据 |
查询:skip | db.collection.find().skip(NUMBER) |
实例1:`db.collection.find().skip(2) 实例2: db.collecti on.find().limit(2).skip(2) 实例3: db.collection.find().skip(2).limit(2)
|
跳过指定数据的数据 实例1:跳过前两条数据 实例2和实例3均为查询第3条和第4条数据 使用此函数可实现分页查询 |
排序:sort | db.collection.find().sort({“key”:1}) |
db.users.find().sort({"age":1}) |
1:升序 -1:降序 |
查询:结果集限制 | “`db.collection.find({},{“key”:0 | 1})“` | db.collection.find({},{"name":1,_id:0]) |
索引 | db.collection.ensureIndex({“key”:1}) |
db.users.ensureIndex("name":1) |
建立索引 1:升序 -1:降序 |
聚合函数 | db.collection.aggregate() |
实例1db.users.aggregate({ _id:"$name", ageSum{$sum:"$age"} }) 实例2 db.users.aggregate([ {$match:{ "age":{$gt:23} } }, { _id:"$name", ageAvg:{$avg:"age"} } ]) 实例3 db.users.aggregate([ {$sort:{ "name":1 } }, { $limit:3 }, {$skip:1 }, { id:"$name", ageAvg:{$avg:"age"} } ]) 实例4: db.users.aggregate({ _id:{name:"$name",age:"$age"}, count:{$sum:1} }) |
实例1select name,sum(age) as ageSum from users group by name 实例2 select name,avg(age) as ageAvg from users where age>23 group by name 实例3 select name,avg(age) as ageAvg from users where age>23 group by name select name from users group by name limit 1,3 order by name asc 实例4 select name,age,count(1) from users group by name,age |
2.2 $type
Double | 1 | String | 2 |
Object | 3 | Array | 4 |
Binary data | 5 | Object id | 7 |
Boolean | 8 | Date | 9 |
Null | 10 | Regular Expression | 11 |
JavaScript | 13 | Symbol | 14 |
JavaScript (with scope) | 15 | 32-bit integer | 16 |
64-bit integer | 18 | Min key | 255 |
Max key | 127 |
3 mongodb java
3.1 连接数据库
3.1.1 无需登录验证
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
public class MongoDBJDBC{
public static void main( String args[] ){
try{
// 连接到 mongodb 服务
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// 连接到数据库 数据库不存在时会创建数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");
System.out.println("Connect to database successfully");
}catch(Exception e){
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
}
}
3.1.2 需要登录验证
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() );
}
}
}
3.2 操作集合
3.2.1 创建集合
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
public class MongoDBJDBC{
public static void main( String args[] ){
try{
// 连接到 mongodb 服务
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// 连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");
System.out.println("Connect to database successfully");
mongoDatabase.createCollection("test");
System.out.println("集合创建成功");
}catch(Exception e){
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
}
}
3.2.2 获取集合
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class MongoDBJDBC{
public static void main( String args[] ){
try{
// 连接到 mongodb 服务
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// 连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");
System.out.println("Connect to database successfully");
MongoCollection<Document> collection = mongoDatabase.getCollection("test");
System.out.println("集合 test 选择成功");
}catch(Exception e){
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
}
}
3.3 操作文档
3.3.1 插入文档
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class MongoDBJDBC{
public static void main( String args[] ){
try{
// 连接到 mongodb 服务
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// 连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");
System.out.println("Connect to database successfully");
MongoCollection<Document> collection = mongoDatabase.getCollection("test");
System.out.println("集合 test 选择成功");
//插入文档
/**
* 1. 创建文档 org.bson.Document 参数为key-value的格式
* 2. 创建文档集合List<Document>
* 3. 将文档集合插入数据库集合中 mongoCollection.insertMany(List<Document>) 插入单个文档可以用 mongoCollection.insertOne(Document)
* */
Document document = new Document("title", "MongoDB").
append("description", "database").
append("likes", 100).
append("by", "Fly");
List<Document> documents = new ArrayList<Document>();
documents.add(document);
collection.insertMany(documents);
System.out.println("文档插入成功");
}catch(Exception e){
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
}
}
3.3.2 检索所有文档
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
public class MongoDBJDBC{
public static void main( String args[] ){
try{
// 连接到 mongodb 服务
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// 连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");
System.out.println("Connect to database successfully");
MongoCollection<Document> collection = mongoDatabase.getCollection("test");
System.out.println("集合 test 选择成功");
//检索所有文档
/**
* 1. 获取迭代器FindIterable<Document>
* 2. 获取游标MongoCursor<Document>
* 3. 通过游标遍历检索出的文档集合
* */
FindIterable<Document> findIterable = collection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
while(mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
}catch(Exception e){
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
}
}
3.3.3 更新文档
import org.bson.Document;
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;
public class MongoDBJDBC{
public static void main( String args[] ){
try{
// 连接到 mongodb 服务
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// 连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");
System.out.println("Connect to database successfully");
MongoCollection<Document> collection = mongoDatabase.getCollection("test");
System.out.println("集合 test 选择成功");
//更新文档 将文档中likes=100的文档修改为likes=200
collection.updateMany(Filters.eq("likes", 100), new Document("$set",new Document("likes",200)));
//检索查看结果
FindIterable<Document> findIterable = collection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
while(mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
}catch(Exception e){
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
}
}
3.3.4 删除第一个文档
import org.bson.Document;
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;
public class MongoDBJDBC{
public static void main( String args[] ){
try{
// 连接到 mongodb 服务
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// 连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol");
System.out.println("Connect to database successfully");
MongoCollection<Document> collection = mongoDatabase.getCollection("test");
System.out.println("集合 test 选择成功");
//删除符合条件的第一个文档
collection.deleteOne(Filters.eq("likes", 200));
//删除所有符合条件的文档
collection.deleteMany (Filters.eq("likes", 200));
//检索查看结果
FindIterable<Document> findIterable = collection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
while(mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
}catch(Exception e){
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
}
}
相关推荐
自己在学习MongoDB的一些笔记,里面有各个查询选择器的使用截图,还有一些索引的介绍。
mongodb学习笔记资料,从安装到操作库collection 对document的crud 索引 replicaSet sharding 备份与恢复
MongoDB 学习笔记 本文档是 MongoDB 学习笔记,涵盖了 NoSQL、Cache、运行平台等多个方面的知识点。 一、NoSQL 数据库 MongoDB MongoDB 是一个强大、灵活、可扩展性好的文档数据存储器,可以完成大部分关系数据库...
本压缩包“mongoDB学习笔记及工具.zip”包含了一些资源,帮助你深入理解和掌握MongoDB的相关知识。 1. **笔记(note.txt)**: 这个文件可能是对MongoDB的基础概念、安装过程、基本操作和进阶特性的详细记录。笔记...
本篇学习笔记将从基础操作到高级功能,详细阐述MongoDB的关键知识点。 首先,MongoDB的基本单元是集合(collection),类似于关系型数据库中的表,而集合中的元素称为文档(document),文档是键值对的集合,类似于...
总结的MongoDB的学习笔记,基本上包括了MongoDB的方方面面,每个知识点,都有示例代码,有需要的朋友,可以下载下来进一步补充完善。
MongoDB 是一种流行的开源、非关系型数据库系统,以其灵活性、高性能和易用性而备受开发者青睐。在本文中,我们将深入探讨 ...在实际项目中,学习和掌握 MongoDB 及其驱动程序能够帮助你更好地应对现代数据存储需求。
MongoDB是一种流行的NoSQL数据库,它的索引机制与传统的关系型数据库类似,旨在提升查询和排序的速度。在MongoDB中,索引对于优化查询性能至关重要,尤其在处理大量数据时。下面将详细介绍MongoDB中不同类型的索引...
MongoDB的GridFS是一个强大的文件存储系统,专为在数据库中存储和检索大量小文件而设计。GridFS将文件拆分为多个数据块(chunk),每个块都有自己的文档存储在`fs.chunks`集合中,而文件元信息则保存在`fs.files`集合...
本文介绍了 MongoDB 的基础使用、技术架构、应用场景、主要特点以及安装步骤。内容涵盖了 MongoDB 的基本操作和配置,深入探讨了其内部技术架构,讨论了适合的应用场景和实际案例,并详细说明了安装过程以帮助读者...
### MongoDB 学习笔记知识点详解 #### 一、MongoDB 命令行基础操作 **1.1 帮助命令** - **help**:显示 MongoDB shell 的基本帮助信息。 - **db.help()**:提供当前数据库的帮助信息。 - **db.mycoll.help()**:...
在本篇MongoDB学习笔记中,我们将探讨如何利用MongoDB的文档结构来描述数据关系。 首先,MongoDB中的“集合”(collection)与关系型数据库中的“表”类似,但两者存在显著差异。在关系型数据库中,表的结构是预定义...