mongodb是一款nosql,和elasticsearch相同點是他們都不擅長存儲關係型數據,可是擅長存儲大數據。與elasticsearch相比mongodb擅長插入,elasticsearch擅長查詢。另外elasticsearch支持全文索引,mongodb雖然也有可是太弱了。但是elasticsearch的mapping不可變,可是mongodb的mapping是可變的。因此若是經費足的話。能夠把他們作成讀寫分離的形式,mongodb用做寫庫,elasticsearch用做讀庫。java
首先下載mongodb,地址:https://www.mongodb.com/download-center#atlasgit
安裝方法很簡單,一直點下一步,知道出現界面裏面有complete和custom兩個字母時,點擊custom選擇安裝位置。而後繼續點下一步,直至安裝完成。正則表達式
打開安裝mongodb的文件夾spring
固然你是沒有data和logs文件夾和mongo.conf文件的,sql
首先新建data文件夾用於mongodb存放數據,若是不指定,mongodb會報錯。mongodb
而後新建logs文件夾,logs文件夾裏新建mongo.log文件用於存放日誌。數據庫
而後新建mongo.conf文件,內容爲數組
# 數據庫路徑 dbpath=D:\mongodb\data # 日誌輸出文件路徑 logpath=D:\mongodb\logs\mongo.log # 錯誤日誌採用追加模式 logappend=true # 啓用日誌文件,默認啓用 journal=true # 這個選項能夠過濾掉一些無用的日誌信息,若須要調試使用請設置爲false quiet=true # 端口號 默認爲27017 port=27017
其中dapath和logpath是你本身剛纔定義的data和mongo.log的路徑session
最後啓動mongodb:app
打開cmd,cd到mongodb安裝路徑的bin目錄下,輸入mongod --config "D:\Mongo\mongo.conf"。這裏是你本身的mong.conf的路徑。若是沒有出現任何信息,那說明成功了。
接下來安裝mongodb可視化工具mongodb compass,地址:https://www.mongodb.com/download-center?jmp=blog#compass,安裝方法也很簡單,一直下一步就行。接下來講一下使用方法。
安裝好後,打開compass
其中hostnae和port分別表示你的mongodb的鏈接路徑和端口,這裏由於是本地安裝並且沒改啥配置文件,因此使用默認的就好,點擊connect而後就看到mongodb的一些默認的庫。
其中pantest是我本身建的庫,點擊create database新建一個庫。
接下來就是如何使用java代碼來操做mongodb。
首先是pom文件須要添加
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.7.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb-log4j</artifactId> <version>1.7.1.RELEASE</version> </dependency>
config.properties文件新加入
mongo.dbname=pantest #數據庫的名字 mongo.host=localhost #mongodb的鏈接路徑 mongo.port=27017 #端口 mongo.connectionsPerHost=8 mongo.threadsAllowedToBlockForConnectionMultiplier=4 mongo.connectTimeout=1000 mongo.maxWaitTime=1500 mongo.autoConnectRetry=true mongo.socketKeepAlive=true mongo.socketTimeout=1500 mongo.slaveOk=true mongo.writeNumber=1 mongo.writeTimeout=0 mongo.writeFsync=true
application.xml文件新加入關於mongodb的相關內容
<!-- MongoDB配置部分 1.mongo:鏈接配置 2.db-factory:至關於sessionFactory 3.mongoTemplate:與數據庫接口交互的主要實現類 --> <mongo:mongo host="${mongo.host}" port="${mongo.port}"> <mongo:options connections-per-host="${mongo.connectionsPerHost}" threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" auto-connect-retry="${mongo.autoConnectRetry}" socket-keep-alive="${mongo.socketKeepAlive}" socket-timeout="${mongo.socketTimeout}" slave-ok="${mongo.slaveOk}" write-number="${mongo.writeNumber}" write-timeout="${mongo.writeTimeout}" write-fsync="${mongo.writeFsync}" /> </mongo:mongo> <mongo:db-factory id="mongoDbFactory" dbname="${mongo.dbname}" mongo-ref="mongo" /> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> </bean>
新建存儲pojo類,而且使用註解指定mapping
/** * @description * @auth panmingshuai * @time 2018年3月22日上午12:19:50 * * * @Id - 用於字段級別,標記這個字段是一個主鍵,默認生成的名稱是「_id」 * @Document - 用於類,以表示這個類須要映射到數據庫,您也能夠指定映射到數據庫的集合名稱 * @DBRef - 用於字段,以表示它將使用com.mongodb.DBRef進行存儲。 * @Indexed - 用於字段,表示該字段須要如何建立索引 * @CompoundIndex - 用於類,以聲明覆合索引 * @GeoSpatialIndexed - 用於字段,進行地理位置索引 * @TextIndexed - 用於字段,標記該字段要包含在文本索引中 * @Language - 用於字段,以設置文本索引的語言覆蓋屬性。 * @Transient - 默認狀況下,全部私有字段都映射到文檔,此註解將會去除此字段的映射 * @PersistenceConstructor - 標記一個給定的構造函數,即便是一個protected修飾的, * 在從數據庫實例化對象時使用。構造函數參數經過名稱映射到檢索的DBObject中的鍵值。 * @Value - 這個註解是Spring框架的一部分。在映射框架內,它能夠應用於構造函數參數。 * 這容許您使用Spring表達式語言語句來轉換在數據庫中檢索的鍵值,而後再用它來構造一個域對象。 * 爲了引用給定文檔的屬性,必須使用如下表達式:@Value("#root.myProperty"),root要指向給定文檔的根。 * @Field - 用於字段,並描述字段的名稱,由於它將在MongoDB BSON文檔中表示,容許名稱與該類的字段名不一樣。 * @Version - 用於字段鎖定,保存操做時檢查修改。初始值是0,每次更新時自動觸發。 * */ @Document(collection = "panuser") public class User implements Serializable { /** serialVersionUID */ private static final long serialVersionUID = 1L; // 主鍵使用此註解 @Id private String id; // 字段使用此註解 @Field private String name; // 字段還能夠用自定義名稱 @Field("myage") private int age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
接下來就是增刪查改的方法,
首先獲取mongoTemplate,使用它來完成增刪查改。
// 使用spring整合的話, 就直接注入就能夠了, 這是測試。 @Before public void testBefore() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-servlet.xml"); mongoTemplate = (MongoTemplate) context.getBean("mongoTemplate"); }
插入一條數據:
@Test public void testAddUser() { User pan = new User(); pan.setId("3"); pan.setAge(19); pan.setName("shuai"); // 插入數據 mongoTemplate.insert(pan); }
能夠經過compass查看是否增長了一條數據
更新數據:
@Test public void testUpdateUser() { // update(query,update,class) // Query query:須要更新哪些用戶,查詢參數 // Update update:操做符,須要對數據作什麼更新 // Class class:實體類 Query query = new Query(); query.addCriteria(Criteria.where("_id").is("2")); Update update = new Update(); update.set("myage", 19); update.set("name", "pan"); mongoTemplate.updateFirst(query, update, User.class); // update.inc("age", 2); age值加2 // update.set("name", "zhangsan"); 直接賦值 // update.unset("name"); 刪去字段 // update.push("interest", "java"); 把java追加到interest裏面,interest必定得是數組 // update.pushAll("interest", new // String[]{".net","mq"});用法同push,只是pushAll必定能夠追加多個值到一個數組字段內 // // update.pull("interest", "study"); 做用和push相反,從interest字段中刪除一個等於value的值 // update.pullAll("interest", new String[]{"sing","dota"})做用和pushAll相反 // update.addToSet("interest", "study") 把一個值添加到數組字段中,並且只有當這個值不在數組內的時候才增長 // update.rename("oldName", "newName") 字段重命名 // 只更新第一條記錄,age加2,name值更新爲zhangsan // mongoTemplate.updateFirst(query, new Update().inc("age", // 2).set("name", "zhangsan"), User.class); // 批量更新,更新全部查詢到的數據 // mongoTemplate.updateMulti(query, update, User.class); }
查詢數據:
@Test public void testQueryUser() { // 查詢主要用到Query和Criteria兩個對象 Query query = new Query(); Criteria criteria = Criteria.where("myage").gt(18); // 大於 // criteria.and("name").is("ming");等於 // criteria.and("interest").in(interests); in查詢 // criteria.and("home.address").is("henan"); 內嵌文檔查詢 // criteria.and("").exists(false); 列存在 // criteria.and("").lte(); 小於等於 // criteria.and("").regex(""); 正則表達式 // criteria.and("").ne(""); 不等於 // 或查詢 // criteria.orOperator(Criteria.where("key1").is("0"),Criteria.where("key1").is(null)); query.addCriteria(criteria); // 排序查詢sort方法,按照age降序排列 query.with(new Sort(new Order(Direction.DESC, "myage")).and(new Sort(new Order(Direction.ASC, "name")))); List<User> userList1 = mongoTemplate.find(query, User.class); System.out.println(userList1); // 指定字段查詢,只查詢age和name兩個字段 // query.fields().include("age").include("name"); // List<User> userList3 = mongoTemplate.find(query, User.class); // printList(userList3); // 分頁查詢 // query.skip(2).limit(3); // List<User> userList4 = mongoTemplate.find(query, User.class); // printList(userList4); // 查詢全部 // printList(mongoTemplate.findAll(User.class)); // 統計數據量 // System.out.println(mongoTemplate.count(query, User.class)); }
刪除數據:
@Test public void testRemoveUser() { Query query = new Query(); Criteria criteria = Criteria.where("age").gt(18); // 刪除年齡大於22歲的用戶 query.addCriteria(criteria); mongoTemplate.remove(query, User.class); }
須要指出的是在更新、刪除數據時可使用查詢數據時使用的方法,將知足某個條件的全部數據進行更新或刪除。