#
本節主要講解一下SVN中tag branch trunk的用法,在SVN中Branch/tag在一個功能選項中,在使用中也往往產生混淆。這里就向大家簡單介紹一下,歡迎大家能和我一起學習SVN中tag branch trunk的用法。
在實現上,branch和tag,對于svn都是使用copy實現的,所以他們在默認的權限上和一般的目錄沒有區別。至于何時用tag,何時用branch,完全由人主觀的根據規范和需要來選擇,而不是強制的(比如cvs)。一般情況下,tag,是用來做一個milestone的,不管是不是release,都是一個可用的版本。這里,應該是只讀的。更多的是一個顯示用的,給人一個可讀(readable)的標記。branch,是用來做并行開發的,這里的并行是指和trunk進行比較。比如,3.0開發完成,這個時候要做一個tag,tag_release_3_0,然后基于這個tag做release,比如安裝程序等。trunk進入3.1的開發,但是3.0發現了bug,那么就需要基于tag_release_3_0做一個branch,branch_bugfix_3_0,基于這個branch進行bugfix,等到bugfix結束,做一個tag,tag_release_3_0_1,然后,根據需要決定branch_bugfix_3_0是否并入trunk。對于svn還要注意的一點,就是它是全局版本號,其實這個就是一個tag的標記,所以我們經常可以看到,什么什么release,基于xxx項目的2xxxx版本。就是這個意思了。但是,它還明確的給出一個tag的概念,就是因為這個更加的可讀,畢竟記住tag_release_1_0要比記住一個很大的版本號容易的多。
branches:分枝
SVN中tag branch trunk的用法,首先看一下branches的介紹。當多個人合作,可能有這樣的情況出現:John突然有個想法,跟原先的設計不太一致,可能是功能的添加或者日志格式的改進等等,總而言之,這個想法可能需要花一段時間來完成,而這個過程中,John的一些操作可能會影響Sally的工作,John從現有的狀態單獨出一個project的話,又不能及時得到Sally對已有代碼做的修正,而且獨立出來的話,John的嘗試成功時,跟原來的合并也存在困難。這時最好的實踐方法是使用branches。John建立一個自己的branch,然后在里面實驗,必要的時候從Sally的trunk里取得更新,或者將自己的階段成果匯集到trunk中。
(svncopySourceURL/trunkDestinationURL/branchName-m"Creatingaprivatebranchofxxxx/trunk.")
trunk:主干
主干,一般來說就是開發的主要呆的地方,
tag: 圖標
在經過了一段時間的開發后,項目到達了一個里程碑階段,你可能想記錄這一階段的代碼的狀態,那么你就需要給代碼打上標簽。
(svncpfile:///svnroot/mojavescripts/trunkfile:///svnroot/mojavescripts/tags/mirrorutils_rel_0_0_1-m"tagedmirrorutils_rel_0_0_1")另有一說,無所謂誰對誰錯。
trunk:表示開發時版本存放的目錄,即在開發階段的代碼都提交到該目錄上。
branches:表示發布的版本存放的目錄,即項目上線時發布的穩定版本存放在該目錄中。
tags:表示標簽存放的目錄。
在這需要說明下分三個目錄的原因,如果項目分為一期、二期、三期等,那么一期上線時的穩定版本就應該在一期完成時將代碼copy到branches上,這樣二期開發的代碼就對一期的代碼沒有影響,如新增的模塊就不會部署到生產環境上。而branches上的穩定的版本就是發布到生產環境上的代碼,如果用戶使用的過程中發現有bug,則只要在branches上修改該bug,修改完bug后再編譯branches上最新的代碼發布到生產環境即可。tags的作用是將在branches上修改的bug的代碼合并到trunk上時創建個版本標識,以后branches上修改的bug代碼再合并到trunk上時就從tags的version到branches最新的version合并到trunk,以保證前期修改的bug代碼不會再合并。
-------------------------------------------------------------------------------------------
介紹SVN中tag branch trunk用法時,一直以來用svn只是當作cvs,也從來沒有仔細看過文檔,直到今天用到,才去翻看svnbook文檔,慚愧
需求一:
有一個客戶想對產品做定制,但是我們并不想修改原有的svn中trunk的代碼。
方法:
用svn建立一個新的branches,從這個branche做為一個新的起點來開發
svncopysvn://server/trunksvn://server/branches/ep-m"initep"
Tip:
如果你的svn中以前沒有branches這個的目錄,只有trunk這個,你可以用
svnmkdirbranches新建個目錄
需求二:
產品開發已經基本完成,并且通過很嚴格的測試,這時候我們就想發布給客戶使用,發布我們的1.0版本
svncopysvn://server/trunksvn://server/tags/release-1.0-m"1.0released"咦,這個和branches有什么區別,好像啥區別也沒有?
是的,branches和tags是一樣的,都是目錄,只是我們不會對這個release-1.0的tag做修改了,不再提交了,如果提交那么就是branches
需求三:
有一天,突然在trunk下的core中發現一個致命的bug,那么所有的branches一定也一樣了,該怎么辦?
svn-r148:149mergesvn://server/trunkbranches/ep其中148和149是兩次修改的版本號。SVN中tag branch trunk用法介紹完畢。
我們在一些著名開源項目的版本庫中,通??梢钥吹絫runk, branches, tags等三個目錄。由于SVN固有的特點,目錄在SVN中并沒有特別的意義,但是這三個目錄卻在大多數開源項目中存在,這是因為這三個目錄反映了軟件開發的通常模式。
trunk是主分支,是日常開發進行的地方。
branches是分支。一些階段性的release版本,這些版本是可以繼續進行開發和維護的,則放在branches目錄中。又比如為不同用戶客制化的版本,也可以放在分支中進行開發。
tags目錄一般是只讀的,這里存儲階段性的發布版本,只是作為一個里程碑的版本進行存檔。
比如一個項目有main.cpp, common.h兩個文件,假設目前在開發的是最新的3.0版本,而且1.0/2.0版本也在進行維護,那么項目樹將類似如下樣子:
project
|
+-- trunk
+ |
+ +----- main.cpp (3.0版本的最新文件)
+ +----- common.h
+
+-- branches
+ |
+ +-- r1.0
+ + |
+ + +---- main.cpp (1.x版本的最新文件)
+ + +---- common.h
+ +
+ +-- r2.0
+ |
+ +---- main.cpp (2.x版本的最新文件)
+ +---- common.h
+
+-- tags (此目錄只讀)
|
+-- r1.0
+ |
+ +---- main.cpp (1.0版本的發布文件)
+ +---- common.h
+
+-- r1.1
+ |
+ +---- main.cpp (1.1版本的發布文件)
+ +---- common.h
+
+-- r1.2
+ |
+ +---- main.cpp (1.2版本的發布文件)
+ +---- common.h
+
+-- r1.3
+ |
+ +---- main.cpp (1.3版本的發布文件)
+ +---- common.h
+
+-- r2.0
+ |
+ +---- main.cpp (2.0版本的發布文件)
+ +---- common.h
+
+-- r2.1
|
+---- main.cpp (2.1版本的發布文件)
+---- common.h
要使用這樣的文件夾結構,在建立項目版本庫時,可首先建好項目文件夾,并在其中建立trunk, branches, tags三個空的子目錄,再將項目文件夾連同這三個子目錄一起導入版本庫。
這樣在trunk中開始進行開發,當需要建立branch或tag時,使用SVN的copy操作進行。
其中tags目錄需要只讀,可以使用SVN中的authz文件控制該目錄的訪問權限為只讀。
Packt celebrates International Day Against DRM, May 6th 2014

According to the definition of DRM on Wikipedia, Digital Rights Management (DRM) is a class of technologies that are used by hardware manufacturers, publishers, copyright holders, and individuals with the intent to control the use of digital content and devices after sale.
However, Packt Publishing firmly believes that you should be able to read and interact with your content when you want, where you want, and how you want – to that end they have been advocates of DRM-free content since their very first eBook was published back in 2004.
To show their continuing support for Day Against DRM, Packt Publishing is offering all its DRM-free content at $10 for 24 hours only on May 6th – that’s all 2000+ eBooks and Videos. Check it out at: http://bit.ly/1q6bpha.
- 安裝SVN客戶端
apt-get install subversion subversion-tools
- 下載代碼
svn co http://svn.shiwan.com/svn/shiwan/branches/program/
- 更新代碼
cd 到欲更新代碼的目錄
svn update
- 安裝MAVEN,下載安裝包并解壓
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz
tar -zxf apache-maven-3.0.3-bin.tar.gz
- 編輯/etc/profile
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
export STORM_HOME=/home/ubuntu/java/storm-0.8.1
export KAFKA_HOME=/home/ubuntu/java/kafka_2.9.2-0.8.1.1
export ZOOKEEPER_HOME=/home/ubuntu/java/zookeeper-3.4.6
export BIN_HOME=/home/ubuntu/java
export MAVEN_HOME=/home/ubuntu/java/apache-maven-3.2.1
export PATH=$JAVA_HOME/bin:$STORM_HOME/bin:$KAFKA_HOME/bin:$ZOOKEEPER_HOME/bin:$BIN_HOME/bin:$MAVEN_HOME/bin:$PATH
- 更新SOURCE
- CD到含有pom.xml的文件夾,運行
mvn package
- CD到target文件夾即可看到已編輯的文件
cd 到欲更新代碼的目錄
ll
-
install ZeroMQ
wget http://download.zeromq.org/historic/zeromq-2.1.7.tar.gz
tar -xzf zeromq-2.1.7.tar.gz
cd zeromq-2.1.7
./configure
//在configure時可能會報缺包,安裝即可:sudo apt-get install g++ uuid-dev
make
sudo make install
-
install JZMQ
git clone https://github.com/nathanmarz/jzmq.git
cd jzmq
./autogen.sh
./configure
make
sudo make install
-
下載并解壓STORM
-
編輯conf/storm.yaml
storm.zookeeper.servers:
- "1.2.3.5"
- "1.2.3.6"
- "1.2.3.7"
storm.local.dir: "/opt/folder"
nimbus.host: "54.72.4.92"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 編輯/etc/profile
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
export STORM_HOME=/home/ubuntu/java/storm-0.8.1
export KAFKA_HOME=/home/ubuntu/java/kafka_2.9.2-0.8.1.1
export ZOOKEEPER_HOME=/home/ubuntu/java/zookeeper-3.4.6
export PATH=$JAVA_HOME/bin:$STORM_HOME/bin:$KAFKA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
-
制作啟動命令: start-storm.sh
storm nimbus &
storm supervisor &
storm ui &
安裝途中如果遇到問題
http://my.oschina.net/mingdongcheng/blog/43009
有時候不知道java安裝在哪里了 通過whereis java命令不能知道java真是的安裝路徑
可以通過 update-alternatives --config java 命令察看
bean@ubuntu :~$ update-alternatives --config java
There is only one alternative in link group java: /usr/lib/jvm/java-7-oracle/jre/bin/java
Nothing to configure.
bean@ubuntu :~$
或者這種方法也可以:
進入到相應的目錄:cd /usr/bin
查看java鏈接到了哪里:ls -l java
localhost:bin root# ls -l java
lrwxr-xr-x 1 root wheel 74 May 18 10:26 java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
Question: I’m unable to do su – on Ubuntu. It says “su: Authentication failure”. How do I fix it? Also, is it possible for me to login to Ubuntu using root account directly?
Answer: Let us address these two question one by one.
Warning: Enabling root is not recommended. If possible, you should always try to perform all administrative tasks using sudo.
Question 1: I’m unable to login using su command. How to fix this?
By default, root account password is locked in Ubuntu. So, when you do su -, you’ll get Authentication failure error message as shown below.
$ su - Password: su: Authentication failure
Enable super user account password on Ubuntu
First, set a password for root user as shown below.
$ sudo passwd root [sudo] password for ramesh: Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
Now with the new password you can login as super user with su command
使用JERSEY框架輸出JSON,需捕獲所有的HTTP錯誤,如404等,業務錯誤及其他未定義的錯誤,將這些錯誤輸出JSON,而不是TOMCAT的錯誤。
JERSEY已和SPRING整合。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee">
<display-name>Restful Web Application</display-name>
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>
com.sun.jersey.spi.spring.container.servlet.SpringServlet
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>restfullapi.rest.service,restfullapi.common.provider,restful.web</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>
<!-- spring logback -->
<context-param>
<param-name>logbackConfigLocation</param-name>
<param-value>classpath:logback.xml</param-value>
</context-param>
<listener>
<listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
</listener>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>restfull-api</param-value>
</context-param>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
AbstractBaseRestfulException.java
public abstract class AbstractBaseRestfulException extends Exception{
private static final long serialVersionUID = 6779508767332777451L;
public AbstractBaseRestfulException()
{
}
public AbstractBaseRestfulException(String message)
{
super(message);
}
public abstract String getErrcode();
public abstract void setErrcode(String errcode);
public abstract String getDescription();
public abstract void setDescription(String description);
}
AbstractBaseRestfulExceptionMapper.java
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.paul.common.exception.AbstractBaseRestfulException;
import com.paul.common.json.DefaultJsonResponse;
@Provider
public class AbstractBaseRestfulExceptionMapper implements ExceptionMapper<AbstractBaseRestfulException>{
private Logger logger = LoggerFactory.getLogger(AbstractBaseRestfulExceptionMapper.class);
public Response toResponse(AbstractBaseRestfulException exception) {
logger.error(exception.getMessage(), exception);
DefaultJsonResponse<Object> response = new DefaultJsonResponse<Object>();
response.setDescription(exception.getDescription());
response.setErrcode(exception.getErrcode());
response.setResult(null);
return Response.status(Status.BAD_REQUEST)
.entity(response)
.type(MediaType.APPLICATION_JSON + ";charset=utf-8")
.build();
}
}
OtherExceptionMapper.java
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.paul.common.json.DefaultJsonResponse;
import com.paul.common.json.JsonResponseStatus;
@Provider
public class OtherExceptionMapper implements ExceptionMapper<Exception>{
private Logger logger = LoggerFactory.getLogger(OtherExceptionMapper.class);
public Response toResponse(Exception exception) {
logger.error(exception.getMessage(), exception);
DefaultJsonResponse<Object> response = new DefaultJsonResponse<Object>();
response.setDescription(JsonResponseStatus.OTHER_ERROR.getMessage() + exception.getMessage());
response.setErrcode(JsonResponseStatus.OTHER_ERROR.getCode());
response.setResult(null);
return Response.status(Status.BAD_REQUEST)
.entity(response)
.type(MediaType.APPLICATION_JSON + ";charset=utf-8")
.build();
}
}
WebApplicationExceptionMapper.java
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.paul.common.json.DefaultJsonResponse;
@Provider
public class WebApplicationExceptionMapper implements ExceptionMapper<WebApplicationException >{
private Logger logger = LoggerFactory.getLogger(WebApplicationExceptionMapper.class);
public Response toResponse(WebApplicationException exception) {
logger.error(exception.getMessage(), exception);
DefaultJsonResponse<Object> response = new DefaultJsonResponse<Object>();
response.setDescription(exception.getMessage());
response.setErrcode(String.valueOf(exception.getResponse().getStatus()));
response.setResult(null);
return Response.status(exception.getResponse().getStatus())
.entity(response)
.type(MediaType.APPLICATION_JSON + ";charset=utf-8")
.build();
}
}
Controller中無須再處理異常
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.paul.common.json.DefaultJsonResponse;
import com.paul.common.json.JsonResponseStatus;
import com.paul.program.stbstart.valueobject.StbStart;
import com.paul.stbstart.valueobject.StbStartRequest;
import com.paul.restfullapi.rest.service.AdvertisementRestfulService;
@Path("/advertisement")
@Controller
public class AdvertisementRestfulController {
private Logger logger = LoggerFactory.getLogger(AdvertisementRestfulController.class);
@Autowired
AdvertisementRestfulService advertisementRestfulService;
@Path("/getAdvertisement")
@Produces({MediaType.APPLICATION_JSON + ";charset=utf-8"})
@GET
public DefaultJsonResponse<StbStart> getAdvertisement(
@DefaultValue("") @QueryParam("version")String version,
@QueryParam("token")String token) throws Exception
{
DefaultJsonResponse<StbStart> response = new DefaultJsonResponse<StbStart>();
StbStartRequest request = new StbStartRequest();
logger.info(version);
request.setVersion(version);
request.setToken(token);
StbStart result = advertisementRestfulService.findByVersion(request);
response.setResult(result);
response.setDescription(JsonResponseStatus.SUCCESS.getMessage());
response.setErrcode(JsonResponseStatus.SUCCESS.getCode());
logger.info("----------------");
// double i = 1/0;
return response;
}
}
一、Mongodb數據更新命令
Mongodb更新有兩個命令:update、save。
1.1update命令
update命令格式:
db.collection.update(criteria,objNew,upsert,multi)
參數說明:
criteria:查詢條件
objNew:update對象和一些更新操作符
upsert:如果不存在update的記錄,是否插入objNew這個新的文檔,true為插入,默認為false,不插入。
multi:默認是false,只更新找到的第一條記錄。如果為true,把按條件查詢出來的記錄全部更新。
示例:
Shell代碼

- > db.classes.insert({"name":"c1","count":30})
- > db.classes.insert({"name":"c2","count":30})
- > db.classes.find()
- { "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c1", "count" : 30 }
- { "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c2", "count" : 30 }
- >
示例1:把count大于20的class name修改為c3
Shell代碼

- > db.classes.update({"count":{$gt:20}},{$set:{"name":"c3"}})
- > db.classes.find()
- { "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c3", "count" : 30 }
- { "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c2", "count" : 30 }
- >
由于沒有指定upsert和multi的值,所以全部默認為false,由結果可以看出,只修改了第一條符合條件的記錄。
示例2:把count大于20的class name修改為c4,設置multi為true
Shell代碼

- > db.classes.update({"count":{$gt:20}},{$set:{"name":"c4"}},false,true)
- > db.classes.find()
- { "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c4", "count" : 30 }
- { "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c4", "count" : 30 }
- >
由于指定了multi為true,所以對兩條符合條件的記錄都進行了更新。
示例3: 把count大于50的class name修改為c5,設置upsert為true
Shell代碼

- > db.classes.update({"count":{$gt:50}},{$set:{"name":"c5"}},true,false)
- > db.classes.find()
- { "_id" : ObjectId("5030f3a3721e16c4ab180cd9"), "name" : "c4", "count" : 30 }
- { "_id" : ObjectId("5030f3ab721e16c4ab180cda"), "name" : "c4", "count" : 30 }
- { "_id" : ObjectId("5030f589ce8fa8884e6cd441"), "name" : "c5" }
- >
在集合中沒有count大于50的記錄,但是由于指定了upsert為true,如果找不到則會插入一條新記錄。
1.2save命令
Mongodb另一個更新命令是save,格式如下:
db.collection.save(obj)
obj代表需要更新的對象,如果集合內部已經存在一個和obj相同的"_id"的記錄,Mongodb會把obj對象替換集合內已存在的記錄,如果不存在,則會插入obj對象。
這條命令比較簡單,示例就省略了。
二、數據更新操作符
1.$inc
用法:{$inc:{field:value}}
作用:對一個數字字段的某個field增加value
示例:將name為chenzhou的學生的age增加5
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 22 }
- #查詢結果顯示年齡為22
- > db.students.update({name:"chenzhou"},{$inc:{age:5}})
- #執行修改,把age增加5
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 27 }
- >
- #查詢結果顯示年齡為27,修改成功
2.$set
用法:{$set:{field:value}}
作用:把文檔中某個字段field的值設為value
示例: 把chenzhou的年齡設為23歲
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 27 }
- > db.students.update({name:"chenzhou"},{$set:{age:23}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 23 }
- >
從結果可以看到,更新后年齡從27變成了23
3.$unset
用法:{$unset:{field:1}}
作用:刪除某個字段field
示例: 將chenzhou的年齡字段刪除
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 23 }
- > db.students.update({name:"chenzhou"},{$unset:{age:1}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou" }
- >
4.$push
用法:{$push:{field:value}}
作用:把value追加到field里。注:field只能是數組類型,如果field不存在,會自動插入一個數組類型
示例:給chenzhou添加別名"michael"
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$push:{"ailas":"Michael"}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael" ], "name" : "chenzhou" }
- >
由結果可以看到,記錄中追加了一個數組類型字段alias,且字段有一個為"Michael"的值
5.pushAll
用法:{$pushAll:{field:value_array}}
作用:用法同$push一樣,只是$pushAll可以一次追加多個值到一個數組字段內。
示例:給chenzhou追加別名A1,A2
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pushAll:{"ailas":["A1","A2"]}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2" ], "name" : "chenzhou" }
- >
6.$addToSet
用法:{$addToSet:{field:value}}
作用:加一個值到數組內,而且只有當這個值在數組中不存在時才增加。
示例:往chenzhou的別名字段里添加兩個別名A3、A4
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$addToSet:{"ailas":["A3","A4"]}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- >
由結果可以看出,更新后ailas字段里多了一個對象,這個對象里包含2個數據,分別是A3、A4
7.$pop
用法:刪除數組內第一個值:{$pop:{field:-1}}、刪除數組內最后一個值:{$pop:{field:1}}
作用:用于刪除數組內的一個值
示例: 刪除chenzhou記錄中alias字段中第一個別名
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pop:{"ailas":-1}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- >
由結果可以看書,第一個別名Michael已經被刪除了。
我們再使用命令刪除最后一個別名:
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pop:{"ailas":1}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
- >
由結果可以看出,alias字段中最后一個別名["A3","A4"]被刪除了。
8.$pull
用法:{$pull:{field:_value}}
作用:從數組field內刪除一個等于_value的值
示例:刪除chenzhou記錄中的別名A1
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pull:{"ailas":"A1"}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A2" ], "name" : "chenzhou" }
- >
9.$pullAll
用法:{$pullAll:value_array}
作用:用法同$pull一樣,可以一次性刪除數組內的多個值。
示例: 刪除chenzhou記錄內的所有別名
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pullAll:{"ailas":["A1","A2"]}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "name" : "chenzhou" }
- >
可以看到A1和A2已經全部被刪除了
10.$rename
用法:{$rename:{old_field_name:new_field_name}}
作用:對字段進行重命名
示例:把chenzhou記錄的name字段重命名為sname
Shell代碼

- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$rename:{"name":"sname"}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "sname" : "chenzhou" }
- >
由結果可以看出name字段已經被更新為sname了。