mongodb學習

    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);
    }

須要指出的是在更新、刪除數據時可使用查詢數據時使用的方法,將知足某個條件的全部數據進行更新或刪除。

demo地址:https://gitee.com/panmingshuai/mongodb-demo.git

相關文章
相關標籤/搜索