本文介紹mongodb的使用
說明
mongodb主要是用來存儲json文檔的,mongodb提供了操作json文檔的一系列的方法
mongodb的語法結構和javascript類似,你可以直接運行JavaScript甚至js文件
由於本人也是剛涉及mongodb,本文僅僅寫了一些入門級別的操作,和在springboot中如何使用mongo
本文會持續更新...
起步
下載地址 https://www.mongodb.com/download-center/v2/community
net start MongoDB 啟動服務
net stop MongoDB 停止服務
sc.exe delete MongoDB 卸載服務
mongo的shell可以直接運行JavaScript
切換到程序安裝目錄
mongo 運行本地mongo
db 查看當前運行哪個數據庫
use mydb 使用指定數據庫
db.version()
mongo通用類型
null
布爾 true false
數值 3.3
字符串 "a"
日期 new Date()
正則 /[a-z]/
數組 ["a", "b", "c"]
對象 {"a": 1}
對象id ObjectId()
代碼 對象值可以直接保存代碼
mongoshell的操作
CRUD操作
mongo的操作風格類似JavaScript
insert操作
post = {"a":1, "b": 2}
db.obj.insert(post)
db.obj.find() 列出全部結果集
db.obj.findOne() 列出第一個
db.obj.insert([{"a": 1}, {"b": 2}, {"c": 3}]) 批量插入
update操作
post={"name": "yejiawei", "age": 18}
db.obj.update({"a":1}, post) 直接將包含{"a":1}的數據替換成新數據
db.foo.update({"c": 3}, {"$inc": {"c": 1}}) 使{"c": 3}記錄的c屬性自增1
db.foo.update({"c": 4}, {"$set": {"i": {"ii": 11}}}) 在{"c": 4}記錄中添加{"i": {"ii": 11}}屬性
db.foo.update({"c": 4}, {"$set": {"i.ii": 111}})
db.foo.update({"c": 4}, {"$push": {"j": 3}}) 往j屬性,下面push成員
db.foo.update({"c": 4}, {"$push": {"j": {"$each": [4,5,6]}}}) 往j屬性,下面push多個成員
db.foo.update({"c": 4}, {"$push": {"j": {"$slice": -5, "$each": [7,8,9]}}}) 往j屬性,下面push多個成員,數組只保留最后5個元素
db.foo.update({"c": 4}, {"$push": {"j": {"$slice": -5, "$each": [13,14,15], "$sort": -1}}}) 往j屬性,下面push多個成員,數組只保留最后5個元素,降序排序
db.obj.update({"a": 1}, {"$inc": {"a": 1}}, true) 第三個參數表示,如果記錄沒有則創建一個
其他的修飾器:
$addToSet 避免值重復插入
{"$pop": {"key": 1}} 從數組末尾刪除一個元素
{"$pop": {"key": -1}} 從數組開頭刪除一個元素
update({}, {"$pull", {"arr": "somevalue"}}) 指定元素刪除
delete操作
db.obj.remove({"c": 3}) 刪除包含{"c": 3}的數據
find 操作
db.obj.find({}, {"a": 1}) 查找第一個包含a的記錄
db.obj.find({"a": {"$gte": 0}}) 查找a值大於等於0的記錄
其他修飾符
$lt 小於
$lte 小於等於
$gt 大於
$in 包含 {"$in", [1,2,3]}
$nin
$or 或者 db.obj.find({"$or": [{"a": 1}, {"a":2}]})
$mod 取模 {"$mod": [2, 1]}
$not 非
$and 與
$all 共
$size 長度
$slice 截取
限制結果
db.obj.find().limit(2) 限制返回結果只能2個
db.obj.find().skip(2) 忽略前2個
db.obj.find().sort({a: 1}) 升序排
shell命令操作
鏈接數據庫
mongo some-host:30000/mydb 運行遠程mongo
mongo --nodb 啟動mongo不連接數據庫
手動鏈接
conn = new Mongo("some-host:30000")
db = conn.getDB("mydb")
查看幫助文檔
db.help()
db.obj.help()
只要你不知道的東西,調用help就行了
執行JavaScript文件
mongo C:\Users\26401\Desktop\demo.js
mongorc配置文件
.mongorc.js文件在用戶主目錄 C:\Users\26401 下,可以在里面添加js,在mongo開啟時自動執行
prompt = function () {
return "Uptime:" + db.serverStatus().uptime + " Documents:" + db.stats().objects + " > ";
}
索引操作
文本索引
db.obj.createIndex({name: "text", description: "text"}) 創建索引
db.obj.find( { $text: { $search: "小李" } } ) 利用索引查找
db.obj.find(
{ $text: { $search: "小李" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } ) 相關性排序
單字段索引和聚合索引
單字段索引
db.obj.createIndex( { age: -1 } ) 降序索引
db.obj.createIndex( { age: -1 }, { unique: true } ) 唯一索引
db.obj.find({"age": {$gt: 18}}) 這種使用方式,降序索引生效
聚合索引
原理和單個索引一樣
db.products.createIndex( { "item": 1, "stock": 1 } )
mongo在springboot中的使用
目錄結構
依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
properties配置
# ===============================
# MONGODB
# ===============================
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
User
package com.springlearn.learn.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Document(collection = "user") // mongo數據庫中的json對象名
public class User {
@Id // 自動映射_id屬性,每一個model都必須要一個這個
private String id;
@Version // 類似更新標識的作用,防止臟查
private Long version;
@Field(value = "name")
private String name;
@Field(value = "age")
private Integer age;
@Field(value = "sex")
private String sex;
public User(String name, Integer age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setname(String name) {
this.name = name;
}
public String getname() {
return name;
}
public void setage(Integer age) {
this.age = age;
}
public Integer getage() {
return age;
}
public void setsex(String sex) {
this.sex = sex;
}
public String getsex() {
return sex;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
WebConfig
package com.springlearn.learn.config;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*")
.allowedHeaders("*");
}
@Bean
public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoMappingContext context) {
// 自定義mongoConverter
MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), context);
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);
return mongoTemplate;
}
}
TestController
package com.springlearn.learn.controller;
import javax.servlet.http.HttpServletRequest;
import com.springlearn.learn.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.mapreduce.GroupBy;
import org.springframework.data.mongodb.core.mapreduce.GroupByResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.TextCriteria;
import org.springframework.data.mongodb.core.query.TextQuery;
import org.springframework.data.mongodb.core.query.Update;
import static org.springframework.data.mongodb.core.query.Query.query;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Update.update;
import java.util.List;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController{
@Autowired
MongoTemplate mongoTemplate;
@ResponseBody
@RequestMapping(value = "/test1/{id}", method = RequestMethod.GET, produces = "application/json")
public Object Test1(HttpServletRequest request, @PathVariable int id){
MongoOperations mongoOps = mongoTemplate;
// 插入數據
// User u = new User("小紅", 10, "女");
// mongoOps.insert(u);
// 獲取數據
// u = mongoOps.findById(u.getId(), User.class);
// 更新數據
// mongoOps.updateFirst(query(where("name").is("小紅")), update("age", 18), User.class);
// User u = mongoOps.findOne(query(where("name").is("小紅")), User.class);
// return u;
// mongoOps.updateFirst(query(where("name").is("小王")), new Update().inc("age", 10), User.class);
// User u = mongoOps.findOne(query(where("name").is("小王")), User.class);
// return u;
// 刪除數據
// mongoOps.remove(query(where("name").is("小紅")), User.class);
// return "刪除成功";
// 全文索引
// Query query = new TextQuery(new TextCriteria().matchingAny("小張", "小李")).sortByScore();
// List<User> users = mongoOps.find(query, User.class);
// return users;
// 規范使用
// Query query = new Query();
// query.with(new Sort(Sort.Direction.DESC, "age"));
// query.limit(1);
// User maxUser = mongoTemplate.findOne(query, User.class);
// if (maxUser == null) {
// return "沒有數據";
// }
// return maxUser;
}
}
其他的一些增刪改操作例子
// { $push : { "category" : { "$each" : [ "spring" , "data" ] } } }
new Update().push("category").each("spring", "data")
// { $push : { "key" : { "$position" : 0 , "$each" : [ "Arya" , "Arry" , "Weasel" ] } } }
new Update().push("key").atPosition(Position.FIRST).each(Arrays.asList("Arya", "Arry", "Weasel"));
// { $push : { "key" : { "$slice" : 5 , "$each" : [ "Arya" , "Arry" , "Weasel" ] } } }
new Update().push("key").slice(5).each(Arrays.asList("Arya", "Arry", "Weasel"));
// { $addToSet : { "values" : { "$each" : [ "spring" , "data" , "mongodb" ] } } }
new Update().addToSet("values").each("spring", "data", "mongodb");
// 不存在則創建document
template.upsert(query(where("ssn").is(1111).and("firstName").is("Joe").and("Fraizer").is("Update")), update("address", addr), Person.class);
// findAndModify的使用
Query query = new Query(Criteria.where("firstName").is("Harry"));
Update update = new Update().inc("age", 1);
Person p = mongoTemplate.findAndModify(query, update, Person.class)
// 使用原始shell命令
BasicQuery query = new BasicQuery("{ age : { $lt : 50 }, accounts.balance : { $gt : 1000.00 }}");
List<Person> result = mongoTemplate.find(query, Person.class);
結尾
由於本人涉及mongodb沒多久,如果你想知道,但是本文沒有的,請告訴我,我會第一時間總結出來並發布填充到本文
請下方留言