MongoDB 針對嵌套對象,多層級結構儲存,增刪改查

來源:互聯網
上載者:User
簡要介紹NOSQL

mongoDB 是屬於NOSQL.什麼是nosql,NoSQL(NoSQL = Not Only SQL ),意即”不僅僅是SQL”。
NoSQL,指的是非關係型的資料庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。

NoSQL用於超大規模資料的儲存。(例如Google或Facebook每天為他們的使用者收集萬億位元的資料)。這些類型的資料存放區不需要固定的模式,無需多餘操作就可以橫向擴充。
mongodb介紹 MongoDB的提供了一個面向文檔儲存,操作起來比較簡單和容易。你可以在MongoDB記錄中設定任何屬性的索引 (如:FirstName=”Sameer”,Address=”8 Gandhi Road”)來實現更快的排序。 你可以通過本地或者網路建立資料鏡像,這使得MongoDB有更強的擴充性。 MongoDb 使用update()命令可以實現替換完成的文檔(資料)或者一些指定的資料欄位 。 Mongodb中的Map/reduce主要是用來對資料進行批量處理和彙總操作。 Map和Reduce。Map函數調用emit(key,value)遍曆集合中所有的記錄,將key與value傳給Reduce函數進行處理。 Map函數和Reduce函數是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。 GridFS是MongoDB中的一個內建功能,可以用於存放大量小檔案。 MongoDB允許在服務端執行指令碼,可以用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義儲存在服務端,下次直接調用即可。 MongoDB支援各種程式設計語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。 MongoDB安裝簡單。 spring 整合使用mongodb

我自己使用mongodb ,是用spring 中帶的mongodb包來使用的。只要的jar包是,下面是maven引用包

        <dependency>            <groupId>org.mongodb</groupId>            <artifactId>mongo-java-driver</artifactId>            <version>2.13.0</version>        </dependency>        <dependency>            <groupId>org.springframework.data</groupId>            <artifactId>spring-data-mongodb</artifactId>            <version>1.6.2.RELEASE</version>        </dependency>
配置mongodb 資料來源 資料連線地址。用一個properties儲存。
mongo.dburl=172.16.40.18:27017mongo.dbname=qingxingmongo.connectionsPerHost=100mongo.threadsAllowedToBlockForConnectionMultiplier=4mongo.maxWaitTime=1500mongo.socketTimeout=1500mongo.connectTimeout=1000mongo.autoConnectRetry=truemongo.socketKeepAlive=truemongo.slaveOk=true
在spring 設定檔中配置資料來源
<!-- ****************************** mongoDB begin **********************************  -->    <!-- 一些串連屬性的設定 -->    <mongo:mongo id="mongo" replica-set="${mongo.dburl}">        <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 dbname="${mongo.dbname}" mongo-ref="mongo" />    <bean id="mappingContext"        class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />    <!-- 去除集合裡的_class屬性 -->    <bean id="defaultMongoTypeMapper"        class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">        <constructor-arg name="typeKey">            <null />        </constructor-arg>    </bean>    <bean id="mappingMongoConverter"        class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />        <constructor-arg name="mappingContext" ref="mappingContext" />        <property name="typeMapper" ref="defaultMongoTypeMapper" />    </bean>    <!-- mongodb的主要操作對象,所有對mongodb的增刪改查的操作都是通過它完成 -->    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />        <constructor-arg name="mongoConverter" ref="mappingMongoConverter" />    </bean>    <!-- 映射轉換器,掃描back-package目錄下的檔案,根據注釋,把它們作為mongodb的一個collection的映射 -->    <mongo:mapping-converter base-package="com.qx.mongodb.doc" />    <!-- mongodb bean的倉庫目錄,會自動掃描擴充了MongoRepository介面的介面進行注入 -->    <mongo:repositories base-package="com.qx.mongodb.dao" />    <!-- ***************************** mongoDB over **********************************  -->
對象的操作。建立映射關係對應。
/** * 教練版的語音播報 *  * @author luoyang * */@Document(collection = "mg_voice")  //存入的表名稱public class MgVoice {    @Id  //標誌為主鍵    private Long cid;    /**     * M 男聲  F 女聲     */    private String voiceType;    /**     * 速度     */    private Integer voiceSpeed;    private List<MgVoiceLibrary> voiceLibrarys;    private List<MgVoicePlan> voicePlans;   public Long getCid(){      return cid;   }....

內嵌對象 MgVoiceLibrary

/** * 教練版的語音庫 *  * @author luoyang * */public class MgVoiceLibrary {    private String lid;    /**     * 2 科目二 3 科目三   4 起步燈光     */    private Integer type;    private String title;    private String content;    /**     * 0 不是  1 是     */    private Integer isTemp;    private String tempCode;    private String tempTitle;    private String tempContent;    private Date updateDate;   public String getLid(){      return lid;   }   .....
增刪改查操作

在做一下的操作之前先介紹spring 中操作mongodb的類。
在之前的配置中可以看到,我們已經引入了一個類:mongoTemplate
import org.springframework.data.mongodb.core.MongoTemplate;

其中所引用的包

import org.springframework.data.mongodb.core.query.Criteria;import org.springframework.data.mongodb.core.query.Query;import org.springframework.data.mongodb.core.query.Update;import org.springframework.stereotype.Service;import com.alibaba.fastjson.JSON;import com.mongodb.BasicDBObject;

所以在我們的service 層 ,利用註解直接使用這個類

   @Autowired   protected MongoTemplate mongoTemplate;
新增
 //新增很簡單,將新增的對象設定好值,直接儲存 MgVoice mgVoice = new MgVoice(); mgVoice.set ....// mongoTemplate.save(mgVoice);
修改。(修改對象的直接屬性)
 {        "cid": 1100658, //教練ID        "voiceType": "F",//語音類型 F女聲 M 男聲        "voiceSpeed": 30, //語音速度        "voiceLibrarys": [            {                "lid": "p2_b9dc7616-b476-40ee-8fd7-982711cece98",//語音ID                "type": 2,//語音類型 2科目二 3科目三                "title": "上坡起步",  //標題                "content": "上坡起步和定點停車",//內容                "isTemp": 1,  //是否是模板 0 不是 1 是                "tempCode": "k2_spqb",//模板代碼  ,也是模板圖片標題                "tempTitle": "上坡起步",//模板標題                "tempContent": "上坡起步和定點停車",//模板內容,供恢複預設使用                "updateDate": "2016-04-28 00:00:00"            },            {                "lid": "p3_ead65a9a-c659-4f55-a7d4-067d8935ee19",                "type": 3,                "title": "靠邊停車",                "content": "請靠邊停車",                "isTemp": 1,                "tempCode": "k3_kbtc",                "tempTitle": "靠邊停車",                "tempContent": "請靠邊停車",                "updateDate": "2016-04-28 00:00:00"            }]            }
我們要修改對象中的 voiceType 和 voiceSpeed  屬性代碼如下
   @Override   public void updateCfg(Long cid,                         Integer speed,                         String type){      Criteria criteria = Criteria.where("cid").is(cid);      Query query = new Query(criteria);      Update update = Update.update("voiceType", type).set("voiceSpeed", speed);      mongoTemplate.updateFirst(query, update, MgVoice.class);   }
修改。(對象中的 嵌套對象)
我們要修改 voiceLibrarys 數組 中 lid = “p2_b9dc7616-b476-40ee-8fd7-982711cece98”,的對象中的 title 和 content 屬性。使用set
   //是修改         Query query = new Query(Criteria.where("cid").is(cid).and("voiceLibrarys.lid").is(lid));         Update update = Update.update("voiceLibrarys.$.title", title).set("voiceLibrarys.$.content", content);         mongoTemplate.updateFirst(query, update, MgVoice.class);

如果是要再voiceLibrarys 這個數組中新增一個對象 使用addToset

  //語音的ID 為空白是新增         lid = getCreateId(type);         MgVoiceLibrary voice = new MgVoiceLibrary();         voice.setLid(lid);         voice.setType(type);         voice.setTitle(title);         voice.setContent(content);         voice.setIsTemp(0);         voice.setUpdateDate(RDate.getCurrentDate());         Query query = Query.query(Criteria.where("cid").is(cid));         Update update = new Update();         update.addToSet("voiceLibrarys", voice);         mongoTemplate.upsert(query, update, MgVoice.class);

如果要刪除數組voiceLibrarys 中的一個對象,對象lid=”p2_b9dc7616-b476-40ee-8fd7-982711cece98” 。 使用pull 屬性

  //刪除 語音 cid  記錄的ID  plid 數組中的一個標記         Query query = Query.query(Criteria.where("cid").is(cid));         BasicDBObject s = new BasicDBObject();         s.put("lid", plid);         Update update = new Update();         update.pull("voiceLibrarys", s);         mongoTemplate.updateFirst(query, update, MgVoice.class);

除了以上的操作 還有一些屬性,例如 unset.
如果update.upset 一個數組。 就會清Null 物件,但是數組大小不會變。

modifies
使用 update.modifies(key) 。 就會把這個對象裡面除了ID 以外的值全部刪除。

如果對象是這樣的。voiceLibrarys 是一個對象,不是數組。同樣要修改title 和 content 對象。

{        "cid": 1100658, //教練ID        "voiceType": "F",//語音類型 F女聲 M 男聲        "voiceSpeed": 30, //語音速度        "voiceLibrarys":             {                "lid": "p2_b9dc7616-b476-40ee-8fd7-982711cece98",//語音ID                "type": 2,//語音類型 2科目二 3科目三                "title": "上坡起步",  //標題                "content": "上坡起步和定點停車",//內容                "isTemp": 1,  //是否是模板 0 不是 1 是                "tempCode": "k2_spqb",//模板代碼  ,也是模板圖片標題                "tempTitle": "上坡起步",//模板標題                "tempContent": "上坡起步和定點停車",//模板內容,供恢複預設使用                "updateDate": "2016-04-28 00:00:00"            }            }

代碼

 //是修改         Query query = new Query(Criteria.where("cid").is(cid));         Update update = Update.update("voiceLibrarys.title", title).set("voiceLibrarys.content", content);         mongoTemplate.updateFirst(query, update, MgVoice.class);

如果要刪除整條記錄。 使用remove

   @Override   public boolean removeVoice(Long cid){         //刪除 語音      Query query = Query.query(Criteria.where("cid").is(cid));      mongoTemplate.remove(query, MgVoice.class);      return true;   }

這裡只是簡單的介紹一些基本的操作方法。
本人只是簡單的看了一下。spring mongodb源碼包中的代碼。源碼包中 也並沒有寫的很詳細。只是給了其他的文檔地址。例如

/**     * Update using the {@literal $pull} update modifier     *      * @see http://docs.mongodb.org/manual/reference/operator/update/pull/     * @param key     * @param value     * @return     */    public Update pull(String key, Object value) {        addMultiFieldOperation("$pull", key, value);        return this;    }

根據
http://docs.mongodb.org/manual/reference/operator/update/pull/
再去查看一些基本的方法的使用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.