溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【MongoDB】spring-data-mongo配置

發布時間:2020-09-01 10:56:01 來源:網絡 閱讀:4872 作者:lizhuquan0769 欄目:MongoDB數據庫
  • config.properties

#mongodb setting
mongo.host=127.0.0.1
mongo.port=27017
mongo.connectionsPerHost=100
mongo.threadsAllowedToBlockForConnectionMultiplier=50
mongo.connectTimeout=1000
mongo.maxWaitTime=1500
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=0
mongo.slaveOk=true


  • spring_mongo.xml

<!--引入配置屬性文件 -->
<context:property-placeholder location="classpath:db.properties" />

<!-- mongodb配置 -->
<mongo:mongo id="mongo" replica-set="${mongo.replica-set}" write-concern="SAFE">
	<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="1" 
		write-timeout="0" 
		write-fsync="true" 
	/>
</mongo:mongo>

<!-- mongo的工廠,通過它來取得mongo實例,dbname為mongodb的數據庫名,沒有的話會自動創建 -->
<mongo:db-factory id="mongoDbFactory" dbname="uba" mongo-ref="mongo" />

<!-- 讀寫分離級別配置  -->
<!-- 首選主節點,大多情況下讀操作在主節點,如果主節點不可用,如故障轉移,讀操作在從節點。 -->
<bean id="primaryPreferredReadPreference" class="com.mongodb.TaggableReadPreference.PrimaryPreferredReadPreference"></bean>
<!-- 最鄰近節點,讀操作在最鄰近的成員,可能是主節點或者從節點。  -->
<bean id="nearestReadPreference" class="com.mongodb.TaggableReadPreference.NearestReadPreference"></bean>
<!-- 從節點,讀操作只在從節點, 如果從節點不可用,報錯或者拋出異常。存在的問題是secondary節點的數據會比primary節點數據舊。  -->
<bean id="secondaryReadPreference" class="com.mongodb.TaggableReadPreference.SecondaryReadPreference"></bean>
<!-- 優先從secondary節點進行讀取操作,secondary節點不可用時從主節點讀取數據  -->
<bean id="secondaryPreferredReadPreference" class="com.mongodb.TaggableReadPreference.SecondaryPreferredReadPreference"></bean>

<!-- mongodb的主要操作對象,所有對mongodb的增刪改查的操作都是通過它完成 -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
	<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
	<property name="readPreference" ref="primaryPreferredReadPreference" />
</bean>

<!-- 映射轉換器,掃描back-package目錄下的文件,根據注釋,把它們作為mongodb的一個collection的映射 -->
<mongo:mapping-converter base-package="dev.lzq.uba.mongo.model" />

<!-- mongodb bean的倉庫目錄,會自動掃描擴展了MongoRepository接口的接口進行注入 -->
<mongo:repositories base-package="dev.lzq.uba.mongo.dao" />


  • entity

@Document(collection = "user")
public class User 
{
	@Id
	private int id;
	private String name;
	private int age;
	private String city;
	private String mote;
	
	public int getId() {
		return id;
	}
	public void setId(int 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;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getMote() {
		return mote;
	}
	public void setMote(String mote) {
		this.mote = mote;
	}
	
}


  • dao配置

public interface MGUserDao extends MongoRepository<User, ObjectId>
{
	/**
	 * 方法名的嚴格遵守規定
	 * @param age
	 * @param page
	 * @return
	 */
	public Page<User> findByAgeGreaterThan(int age, Pageable page);
	
	/**
	 * 有@Query聲明查詢, 方法名不需要嚴格遵守規定
	 * @param name
	 * @param ageFrom
	 * @param ageTo
	 * @param pageable
	 * @return
	 */
	@Query("{'name':{'$regex':?0}, 'age': {'$gte':?1,'$lte':?2}}")
	public Page<User> findByNameAndAgeRange(String name, int ageFrom, int ageTo, Pageable pageable);
	
	@Query("{?0:?1}")
	public List<User> findByAttribute(String key, String value);
}


  • dao層的使用

    MongoRepository實現了的只是最基本的增刪改查的功能,要想增加額外的查詢方法,可以按照以下規則定義接口的方法。自定義查詢方法,格式為“findBy+字段名+方法后綴”,方法傳進的參數即字段的值,此外還支持分頁查詢,通過傳進一個Pageable對象,返回Page集合。 例如:

//查詢大于age的數據 
public Page<Product> findByAgeGreaterThan(int age,Pageable page) ;

    

    下面是支持的查詢類型,每三條數據分別對應:(方法后綴,方法例子,mongodb原生查詢語句)

GreaterThan(大于) 
findByAgeGreaterThan(int age) 
{"age" : {"$gt" : age}}

LessThan(小于) 
findByAgeLessThan(int age) 
{"age" : {"$lt" : age}}

Between(在...之間) 
findByAgeBetween(int from, int to) 
{"age" : {"$gt" : from, "$lt" : to}}

IsNotNull, NotNull(是否非空) 
findByFirstnameNotNull() 
{"age" : {"$ne" : null}}

IsNull, Null(是否為空) 
findByFirstnameNull() 
{"age" : null}

Like(模糊查詢) 
findByFirstnameLike(String name) 
{"age" : age} ( age as regex)

(No keyword) findByFirstname(String name) 
{"age" : name}

Not(不包含) 
findByFirstnameNot(String name) 
{"age" : {"$ne" : name}}

Near(查詢地理位置相近的) 
findByLocationNear(Point point) 
{"location" : {"$near" : [x,y]}}

Within(在地理位置范圍內的) 
findByLocationWithin(Circle circle) 
{"location" : {"$within" : {"$center" : [ [x, y], distance]}}}

Within(在地理位置范圍內的) 
findByLocationWithin(Box box) 
{"location" : {"$within" : {"$box" : [ [x1, y1], x2, y2]}}}


    盡管以上查詢功能已經很豐富,但如果還不能滿足使用情況的話可以用一下方法---基于mongodb原本查詢語句的查詢方式。

    例一:在原接口中加入,注釋Query里面的就是mongodb原來的查詢語法,我們可以定義傳進來的查詢參數,通過坐標定義方法的參數。

@Query("{ 'name':{'$regex':?2,'$options':'i'}, sales': {'$gte':?1,'$lte':?2}}")
public Page<Product> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);

    例二:還可以在后面指定要返回的數據字段,如上面的例子修改如下,則只通過person表里面的name和age字段構建person對象。

@Query(value="{ 'name':{'$regex':?2,'$options':'i'}, sales':{'$gte':?1,'$lte':?2}}",fields="{ 'name' : 1, 'age' : 1}") 
public Page<Product> findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女