MongoDB学习文档说明收获
一、简介
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
安装包地址:https://www.mongodb.com/try/download/community
安装说明及注意事项:https://www.runoob.com/mongodb/mongodb-window-install.html
可视化工具:https://robomongo.org/download
二、体系结构
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
三、数据类型
数据类型 | 描述 |
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
四、MongoDB语法
1、选择创建、查看、删除数据库
**选择创建:**use 数据库名 (如果数据库存在则选择该数据库,如果数据库不存在则自动创建)
**查看:**show dbs
**删除:**先选择数据库 再删除 db.dropDatabase()
2、创建、选择、查看、删除集合
创建:db.createCollection(name, options)
name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项
options 可以是如下参数:
字段 | 类型 | 描述 |
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | 3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
**选择:**use 集合名
**查看:**show collections (查看集合,需要先选择数据库之后,才能查看该数据库的集合)
**删除:**db.集合名.drop()
3、文档操作
**插入:**db.集合名称.insert(数据)
例如:db.test.insert({name:“test01”,userid:“1001”})
**查询:**db.集合名称.find()
例如:db.test.find() db.test.findOne({userid:‘1001’}) db.test.find().limit(2)
**修改:**db.集合名称.update(条件,修改后的数据)
例如:db.test.update({_id:“1001”},{name:“test02”}) 执行后发现,这条文档除了thumbup字段其它字段都不见了。
为了解决这个问题,我们需要使用修改器KaTeX parse error: Expected '}', got 'EOF' at end of input: …({_id:"1001"},{set:{name:“test02”}})
**删除:**db.集合名称.remove(条件)
例如:db.comment.remove({name:“test02”})
4、统计
db.comment.count()
按条件统计:db.comment.count({userid:“1001”})
5、模糊查询
MongoDB的模糊查询是通过正则表达式的方式实现的
包含:db.test.find({name:/te/})
开头:db.test.find({content:/^te/})
6、条件查询
- (>) 大于 $gt
- (<) 小于 $lt
- (>=) 大于等于 $gte
- (<= ) 小于等于 $lte
- (!=) 不等于 $ne
例如:db.test.find({num:{$gt:1000}})
7、条件连接
$and:[ {条件},{条件},{条件} ]
例如:查询大于等于1001并且小于1003的用户:
db.test.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: and:[ {userid:{gte:1001}} ,{userid:{$lt:1003} }]})
五、使用Java代码完成CRUD
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.HashMap;
/**
* @author ygm
* @description
* @date 2020/9/28
*/
public class DoTest {
MongoClient mongoClient = null;
MongoDatabase database = null;
MongoCollection<Document> collection = null;
/**
* 初始化
*/
@Before
public void init() {
mongoClient = new MongoClient("localhost", 27017);
database = mongoClient.getDatabase("test");
collection = database.getCollection("test");
}
@After
public void after() {
mongoClient.close();
}
/**
* 连接测试
*/
@Test
public void test01() {
try {
System.out.println("Connect to database successfully");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 查询所有
*/
@Test
public void test02() {
FindIterable<Document> documents = collection.find();
for (Document document : documents) {
System.out.println("_id:" + document.get("_id"));
System.out.println("content:" + document.get("content"));
System.out.println("userid:" + document.get("userid"));
System.out.println("num:" + document.get("num"));
}
}
/**
* 根据id查询
*/
@Test
public void test03() {
FindIterable<Document> documents = collection.find(new BasicDBObject("_id", "1"));
for (Document document : documents) {
System.out.println("_id:" + document.get("_id"));
System.out.println("content:" + document.get("content"));
System.out.println("userid:" + document.get("userid"));
System.out.println("num:" + document.get("num"));
}
}
/**
* 修改
*/
@Test
public void test04() {
//修改的条件
Bson filter = new BasicDBObject("_id", "6");
//修改的数据
Bson data = new BasicDBObject("$set", new Document("userid", "8888"));
collection.updateOne(filter, data);
}
/**
* 新增
*/
@Test
public void test05() {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("_id", "7");
map.put("content", "很棒!");
map.put("userid", "9999");
map.put("num", 123);
Document document = new Document(map);
collection.insertOne(document);
}
/**
* 删除
*/
@Test
public void test06() {
Bson filter = new BasicDBObject("_id", "7");
collection.deleteOne(filter);
}
}
六、MongoTemplate的使用
已封装了MongodbUtils,可通过MongodbUtils获取MongoTemplate
依赖:
<dependency>
<groupId>dbox.slite</groupId>
<artifactId>slite-mongodb</artifactId>
<version>${slite.version}</version>
</dependency>
导入:
<import resource="classpath:META-INF/spring/slite-mongodb.xml" />
1、检索数据
public void mongoDbJavaTest(){
MongoDbJavaTest mongoDbJavaTest = new MongoDbJavaTest();
mongoDbJavaTest.setName("admin");
mongoDbJavaTest.setRemarks("测试");
Query query = Query.query(Criteria.where("name").is("admin"));
mongoTemplate.find(query,MongoDbJavaTest.class);
mongoTemplate.find(query,MongoDbJavaTest.class,"mongodb_java_test");
mongoTemplate.findAll(MongoDbJavaTest.class);
mongoTemplate.findAll(MongoDbJavaTest.class,"mongodb_java_test");
mongoTemplate.query(MongoDbJavaTest.class);
}
2、插入数据
public void mongoDbJavaSave(){
List<MongoDbJavaTest> list = new ArrayList<>();
MongoDbJavaTest mongoDbJavaTest = new MongoDbJavaTest();
mongoDbJavaTest.setName("admin");
mongoDbJavaTest.setRemarks("测试");
list.add(mongoDbJavaTest);
// 保存对象到mongodb
mongoTemplate.save(mongoDbJavaTest);
mongoTemplate.insert(mongoDbJavaTest);
// 根据集合名称保存对象到mongodb
mongoTemplate.save(mongoDbJavaTest,"mongodb_java_test");
mongoTemplate.insert(mongoDbJavaTest,"mongodb_java_test");
// 根据集合名称保存list到mongodb
mongoTemplate.save(list,"mongodb_java_test");
mongoTemplate.insert(list,"mongodb_java_test");
mongoTemplate.insert(list,MongoDbJavaTest.class);
}
3、更新数据
public void mongoDbJavaUpdate(){
MongoDbJavaTest mongoDbJavaTest = new MongoDbJavaTest();
mongoDbJavaTest.setId("5d1312aeb1829c279c6c256b");
mongoDbJavaTest.setName("admin");
mongoDbJavaTest.setRemarks("测试");
Query query = Query.query(Criteria.where("_id").is("5d1312aeb1829c279c6c256b"));
Update update = Update.update("name","admin");
// 更新一条数据
mongoTemplate.updateFirst(query,update, MongoDbJavaTest.class);
mongoTemplate.updateFirst(query,update, "mongodb_java_test");
mongoTemplate.updateFirst(query,update, MongoDbJavaTest.class,"mongodb_java_test");
// 根据实体更新
mongoTemplate.update(mongoDbJavaTest.getClass());
// 更新多条数据
mongoTemplate.updateMulti(query,update, MongoDbJavaTest.class);
mongoTemplate.updateMulti(query,update,"mongodb_java_test");
mongoTemplate.updateMulti(query,update, MongoDbJavaTest.class,"mongodb_java_test");
// 更新数据,如果数据不存在就新增
mongoTemplate.upsert(query,update, MongoDbJavaTest.class);
mongoTemplate.upsert(query,update,"mongodb_java_test");
mongoTemplate.upsert(query,update, MongoDbJavaTest.class,"mongodb_java_test");
}
4、删除数据
public void mongoDbJavaRemove(){
List<MongoDbJavaTest> list = new ArrayList<>();
MongoDbJavaTest mongoDbJavaTest = new MongoDbJavaTest();
mongoDbJavaTest.setId("5d1312aeb1829c279c6c256b");
list.add(mongoDbJavaTest);
Query query = Query.query(Criteria.where("_id").in("5d1312aeb1829c279c6c256b","5d13133ab1829c29d02ce29c"));
// 根据条件删除
mongoTemplate.remove(query);
mongoTemplate.remove(mongoDbJavaTest);
mongoTemplate.remove(MongoDbJavaTest.class);
// 根据条件删除(可删除多条)
mongoTemplate.remove(query,CarryUserInfo.class);
mongoTemplate.remove(query,MongoDbJavaTest.class,"mongodb_java_test");
}