1. 程式人生 > >Mongodb的一些基本操作

Mongodb的一些基本操作

MongoDB配置,CRUD操作,條件查詢

簡單記錄一下自己使用的MongoDB的一些操作。

配置

處理了_class的不必要的生成,自定義一個遞增的註解:

//mongodb中生成的記錄忽略_class欄位
@Configuration
public class MongoConfig {
	@Bean
	public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context,
			BeanFactory beanFactory) {
		DbRefResolver dbRefResolver =
new DefaultDbRefResolver(factory); MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context); try { mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class)); } catch (NoSuchBeanDefinitionException ignore) { } // Don't save _class to mongo
mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null)); return mappingConverter; } }

自定義遞增註解,mongodb無法設定欄位自動遞增,mongodb資料型別是一些基本資料型別,如果欄位不設定int,long型別無法實現自動註解的功能。通過監聽mongodb的生命週期事件,然後進行重寫實現。

@Component
public class MongoDBEventListener extends AbstractMongoEventListener<Object>
{ @SuppressWarnings("unused") private static final Logger LOG = LoggerFactory.getLogger(MongoDBEventListener.class); @Autowired private MongoTemplate mongoTemplate; /** * 在新增記錄的時候,回撥介面方法,監聽文件插入記錄的操作,使用反射方法對ID進行自增 * * @param event * @since 1.8 */ @Override public void onBeforeConvert(BeforeConvertEvent<Object> event) { final Object source = event.getSource(); // 獲取事件最初發生的物件 if (source != null) { // 使用反射工具類,實現回撥介面的方法,對成員進行操作 ReflectionUtils.doWithFields(source.getClass(), new FieldCallback() { @Override public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { ReflectionUtils.makeAccessible(field); // 使操作的成員可訪問 // 如果是帶有@AutoIncrement註解的,成員呼叫getter方法返回的型別是Number型別的,返回的型別都是0的(沒有賦值,預設為0) if (field.isAnnotationPresent(AutoIncrement.class) && field.get(source) instanceof Number && field.getLong(source) == 0) { String collName = source.getClass().getSimpleName().substring(0, 1).toLowerCase() + source.getClass().getSimpleName().substring(1); // setter方法的呼叫,使ID成員屬性,進行自增 field.set(source, getNextId(collName)); } } }); } } /** * 返回下一個自增的ID * * @param collName * 集合名稱(一般規則是,類名的第一個字母小寫,然後按照駝峰書寫法) * @return Long 序列值 */ private Long getNextId(String collName) { Query query = new Query(Criteria.where("collName").is(collName)); List<SequenceId> list = mongoTemplate.find(query, SequenceId.class); SequenceId seq = null; Date now = new Date(); if(list.size() > 0){ Update update = new Update(); update.inc("seqId", 1).set("gmtUpdate",now); FindAndModifyOptions options = new FindAndModifyOptions(); options.upsert(true); options.returnNew(true); seq = mongoTemplate.findAndModify(query, update, options, SequenceId.class); return seq.getSeqId(); }else{ seq = new SequenceId(); seq.setCollName(collName); seq.setGmtCreate(now); seq.setIsDelete("0"); seq.setSeqId((long) 1); mongoTemplate.save(seq); return seq.getSeqId(); } } /** * Captures {@link BeforeSaveEvent}. * * @param event will never be {@literal null}. * @since 1.8 */ @Override public void onBeforeSave(BeforeSaveEvent<Object> event) { //super.onBeforeSave(event); } /** * Captures {@link AfterSaveEvent}. * * @param event will never be {@literal null}. * @since 1.8 */ @Override public void onAfterSave(AfterSaveEvent<Object> event) { //super.onAfterSave(event); } /** * 過濾掉isDelete=1 的資料 * */ @Override public void onAfterLoad(AfterLoadEvent<Object> event) { //super.onAfterLoad(event); } /** * Captures {@link AfterConvertEvent}. * * @param event will never be {@literal null}. * @since 1.8 */ @Override public void onAfterConvert(AfterConvertEvent<Object> event) { //super.onAfterConvert(event); } /** * Captures {@link AfterDeleteEvent}. * * @param event will never be {@literal null}. * @since 1.8 */ @Override public void onAfterDelete(AfterDeleteEvent<Object> event) { //super.onAfterDelete(event); } /** * Capture {@link BeforeDeleteEvent}. * * @param event will never be {@literal null}. * @since 1.8 */ @Override public void onBeforeDelete(BeforeDeleteEvent<Object> event) { //super.onBeforeDelete(event); } }

CRUD操作

簡單的CRUD操作可以繼承MongoRepository。也可以注入MongoTemplate 或者是MongoOperations進行一些操作,這兩個類裡面封裝了很多原生的方法。

條件查詢

  • 繼承MongoRepository
   @Override
	<S extends T> List<S> findAll(Example<S> example);

	/* 
	 * (non-Javadoc)
	 * @see org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example, org.springframework.data.domain.Sort)
	 */
	@Override
	<S extends T> List<S> findAll(Example<S> example, Sort sort);

Example 的使用利用一個物件設定欄位值,

/*
 * Copyright 2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.data.domain;

import org.springframework.util.ClassUtils;

/**
 * Support for query by example (QBE). An {@link Example} takes a {@code probe} to define the example. Matching options
 * and type safety can be tuned using {@link ExampleMatcher}.
 *
 * @author Christoph Strobl
 * @author Mark Paluch
 * @author Oliver Gierke
 * @param <T> the type of the probe.
 * @since 1.12
 */
public interface Example<T> {

	/**
	 * Create a new {@link Example} including all non-null properties by default.
	 *
	 * @param probe must not be {@literal null}.
	 * @return
	 */
	static <T> Example<T> of(T probe) {
		return new TypedExample<>(probe, ExampleMatcher.matching());
	}

	/**
	 * Create a new {@link Example} using the given {@link ExampleMatcher}.
	 *
	 * @param probe must not be {@literal null}.
	 * @param matcher must not be {@literal null}.
	 * @return
	 */
	static <T> Example<T> of(T probe, ExampleMatcher matcher) {
		return new TypedExample<>(probe, matcher);
	}

	/**
	 * Get the example used.
	 *
	 * @return never {@literal null}.
	 */
	T getProbe();

	/**
	 * Get the {@link ExampleMatcher} used.
	 *
	 * @return never {@literal null}.
	 */
	ExampleMatcher getMatcher();

	/**
	 * Get the actual type for the probe used. This is usually the given class, but the original class in case of a
	 * CGLIB-generated subclass.
	 *
	 * @return
	 * @see ClassUtils#getUserClass(Class)
	 */
	@SuppressWarnings("unchecked")
	default Class<T> getProbeType() {
		return (Class<T>) ClassUtils.getUserClass(getProbe().getClass());
	}
}

利用ExampleMatcher matcher可以設定一些條件

  • 另外的一種條件拼接採用MongoTemplate 的方法
    @Override
	public List<RecordApi> findByPage(RecordApiForm form, Pageable pageable) {
		Query query = new Query();
		if (StringUtils.isNotBlank(form.getChannel())) {
			query.addCriteria(Criteria.where("channel").regex("^.*" + form.getChannel() + ".*$"));
		}
		if (StringUtils.isNotBlank(form.getBusiness())) {
			query.addCriteria(Criteria.where("business").regex("^.*" + form.getBusiness() + ".*$"));
		}
		if (StringUtils.isNotBlank(form.getMethod())) {
			query.addCriteria(Criteria.where("method").regex("^.*" + form.getMethod() + ".*$"));
		}
		if (isEmpty(form.getStart_time()) && isEmpty(form.getEnd_time())) {
			query.addCriteria(Criteria.where("gmtCreate").gte(form.getStart_time()).lte(form.getEnd_time()));
		} else if (isEmpty(form.getStart_time())) {
			query.addCriteria(Criteria.where("gmtCreate").gte(form.getStart_time()));
		} else if (isEmpty(form.getEnd_time())) {
			query.addCriteria(Criteria.where("gmtCreate").lte(form.getEnd_time()));
		}
		if (isEmpty(pageable)) {
			query.with(pageable);
		}
		return mongoTemplate.find(query, RecordApi.class);
	}

相關推薦

MongoDB 一些基本操作

1. 查詢指定資料庫的集合當前可用的儲存空間    use fragment > db.test2.storageSize()   --1396736 2. 查詢指定資料庫的集合分配的儲存空間> db.baseSe.totalSize()  --1731952

Mongodb一些基本操作

MongoDB配置,CRUD操作,條件查詢 簡單記錄一下自己使用的MongoDB的一些操作。 配置 處理了_class的不必要的生成,自定義一個遞增的註解: //mongodb中生成的記錄忽略_class欄位 @Configuration public cla

MongoDB一些基本操作

MongoDB設定快取時間 def __init__(self,client=None,expires=timedelta(days=30)): self.client = MongoClient('localhost', 27017) s

Mysql數據庫的一些基本操作

-h 知識 刪除mysql init rst 建表 自動刪除 fault order 今天,終於把MySQL數據庫的知識系統的過了一遍,下面整理出一些常用的基本操作。 一、MySQL服務器的啟動與關閉 1、啟動MySQL服務器 開始 -> 運行 輸入“cmd”,然

MongoDb基本操作快速入門

基本操作 mongodb mongodb增刪該查操作示例 mongodb快速入門 1.MongoDb簡介 mongodb是一個基於分布式存儲的開源數據庫系統又被稱為文檔數據庫,可以將數據存儲為一個文檔,數據結構有鍵值對(key=>value)對組成,存儲的文檔類似於JSON對象(BS

js 數組的一些基本操作

循環 負數 16px 抽取 .sh 自己 方法 多少 不包含 var arr1 = [1,2,3,4,5,6];    arr1[0];    arr1[1]; console.log("長度:"+arr1.length); 一、遍歷數組

git 的一些基本操作

str 一個 修改信息 rem 建倉 文件添加 nbsp init origin 獲取倉庫 git init:初始化一個倉庫,當前目錄下生成 .git 目錄,該目錄為倉庫。 git init --bare :生成裸倉庫,不存在 .git 目錄。 git clone (

mongodb基本操作

hang 默認 數據庫名 capped img .so 全部 html 文檔 查詢所有的數據庫 show dbs 指定到一個數據庫/或者創建 use 數據庫名 指定儲存大小 db.createCollection("mycoll",{capped:true,size 10

【網絡爬蟲入門05】分布式文件存儲數據庫MongoDB基本操作與爬蟲應用

數據庫的操作 理解 src web 文件存儲 學習 json格式 關系型 log 【網絡爬蟲入門05】分布式文件存儲數據庫MongoDB的基本操作與爬蟲應用 廣東職業技術學院 歐浩源 1、引言 網絡爬蟲往往需要將大量的數據存儲到數據庫中,常用的有MySQL、Mon

Mongodb aggregation 基本操作示例

6.5 find 記錄 查詢條件 logs 字段值 pan 示例 統計 MongoDB二個主要的操作:一個是查詢,另一個是統計。對於查詢而言,主要是find()方法,再配合Filters組合多個查詢條件。 對於統計而言,則主要是aggregate操作,比如 group、su

2.QT字符串及一些基本操作

spa pac body slot exp str delet str2 AR mainwindow.h 1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow>

關於BeautifulSoup的一些基本操作

截圖 說了 spa 圖片 info font beautiful 9.png ima 這篇可能講的沒那麽詳細,其實不難的,我學這個主要是用於Scrapy框架,媽嗨,Scrapy框架真的是嗨快的 送它幾百個大拇指。以下就截圖了,該說的都說了 關於Beauti

Centos 6.9中 http-2.2 中的一些基本操作和 https 的實現

http http-2.2 https 首先聲明: 接下來的所有的操作都是基於防火墻和selinux關閉的情況下;是基於本地的實現;1.建立httpd服務,要求: 1) 提供兩個基於名稱的虛擬主機www1, www2;要求每個虛擬主機都有單獨的錯誤日誌

C++標準庫中棧和隊列的一些基本操作

AS PE 元素 返回值 nbsp 返回 void 入隊 style 棧:   <1>使用棧,要包含頭文件:#include <stack>   <2>定義棧,stack<Type> s; 其中Type為數據類型,可以是基本數

列表的一些基本操作

ring 利用 列表排序 put eas 參數 user 順序 else 定義空list,定義list不能使用使用list關鍵字List_1 = []定義包含數據的listList_2 = [1,2.0,3+4j,”abc”,(1,2,3),[5,6],{“username

MongoDB基本操作與日常維護

啟動 地址 自己的 進制 日常 sea .... object abc MongoDB基本操作 MongoDB的基本操作主要是對數據庫、集合、文檔的操作,包括創建數據庫、刪除數據庫、插入文檔、更改文檔、刪除文檔、和查詢文檔。 操作 描述 show dbs 查看

關於linux的一些基本操作

分布 分隔 top halt 關機 進行 inux ast 重命名文件 學習了一下linux的基本操作。寫在這裏做一點自己的總結和未來的回看罷。首先是一個關於linux的系統安裝,這裏安裝的是linux的CentOS6.9的系統,現在最新的CentOS系統已經來了7.0,我

mongodb基本操作之數據刪除

table rop test 數據 error: 不同的 mon error tables 刪除操作使用remove進行,數據的刪除與查詢類似,接受一個參數,與查詢不同的是,為了防止誤操作,刪除操作不允許不傳參數 比如 db.test_collection

linux的一些基本操作

內容 5.1 star 解壓 unzip 取反 find cat fin Linux 命令總結 啟動終端: ctr+alt+t,無需多言 終端字體放大: ctr+shift+‘+‘,終端字體縮小: ctr+‘-‘,無需多言 ls: 查看當前目錄下的文件信息 pwd:

mac一些基本操作

分享 操作 pat bash png 基本 技術 輸入 終端 1、添加環境變量 打開終端,輸入 open .bash_profile 然後,你會看到如下: 然後,編輯文本,export PATH="你要添加的路徑" 最後在執行:source ~/.bash_profil