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