mongodb基本操作和在springboot中的使用


本文介紹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沒多久,如果你想知道,但是本文沒有的,請告訴我,我會第一時間總結出來並發布填充到本文

請下方留言


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM