博客首页|TW首页| 同事录|业界社区
2011-01-16

5. PHP列出目录内容

01 function list_files($dir)
02 {
03 if(is_dir($dir))
04 {
05 if($handle = opendir($dir))
06 {
07 while(($file = readdir($handle)) !== false)
08 {
09 if($file != “.” && $file != “..” && $file != “Thumbs.db”)
10 {
11 echo ‘’.$file.’
’.”\n”;
12 }
13 }
14 closedir($handle);
15 }
16 }
17 }

6. PHP销毁目录

删除一个目录,包括它的内容。

01 /*****
02 *@dir – Directory to destroy
03 *@virtual[optional]- whether a virtual directory
04 */
05 function destroyDir($dir, $virtual = false)
06 {
07 $ds = DIRECTORY_SEPARATOR;
08 $dir = $virtual ? realpath($dir) : $dir;
09 $dir = substr($dir, -1) == $ds ? substr($dir, 0, -1) : $dir;
10 if (is_dir($dir) && $handle = opendir($dir))
11 {
12 while ($file = readdir($handle))
13 {
14 if ($file == ‘.’ || $file == ‘..’)
15 {
16 continue;
17 }
18 elseif (is_dir($dir.$ds.$file))
19 {
20 destroyDir($dir.$ds.$file);
21 }
22 else
23 {
24 unlink($dir.$ds.$file);
25 }
26 }
27 closedir($handle);
28 rmdir($dir);
29 return true;
30 }
31 else
32 {
33 return false;
34 }
35 }

7. PHP解析 JSON 数据

与大多数流行的 Web 服务如 twitter 通过开放 API 来提供数据一样,它总是能够知道如何解析 API 数据的各种传送格式,包括 JSON,XML 等等。

1 $json_string=’{“id”:1,”name”:”foo”,”email”:”foo@foobar.com”,”interest”:["wordpress","php"]} ‘;
2 $obj=json_decode($json_string);
3 echo $obj->name; //prints foo
4 echo $obj->interest[1]; //prints php
8. PHP解析 XML 数据

01 //xml string
02 $xml_string=”
03
04
05 Foo
06  foo at bar.com
07
08
09 Foobar
10  foobar at foo.com
11
12 ”;
13
14 //load the xml string using simplexml
15 $xml = simplexml_load_string($xml_string);
16
17 //loop through the each node of user
18 foreach ($xml->user as $user)
19 {
20 //access attribute
21 echo $user['id'], ‘ ‘;
22 //subnodes are accessed by -> operator
23 echo $user->name, ‘ ‘;
24 echo $user->email, ‘
’;
25 }

9. PHP创建日志缩略名

创建用户友好的日志缩略名。

1 function create_slug($string){
2 $slug=preg_replace(‘/[^A-Za-z0-9-]+/’, ‘-’, $string);
3 return $slug;
4 }

1. PHP可阅读随机字符串

此代码将创建一个可阅读的字符串,使其更接近词典中的单词,实用且具有密码验证功能。

01 /**************
02 *@length – length of random string (must be a multiple of 2)
03 **************/
04 function readable_random_string($length = 6){
05 $conso=array(“b”,”c”,”d”,”f”,”g”,”h”,”j”,”k”,”l”,
06 “m”,”n”,”p”,”r”,”s”,”t”,”v”,”w”,”x”,”y”,”z”);
07 $vocal=array(“a”,”e”,”i”,”o”,”u”);
08 $password=””;
09 srand ((double)microtime()*1000000);
10 $max = $length/2;
11 for($i=1; $i<=$max; $i++)
12 {
13 $password.=$conso[rand(0,19)];
14 $password.=$vocal[rand(0,4)];
15 }
16 return $password;
17 }

2. PHP生成一个随机字符串

如果不需要可阅读的字符串,使用此函数替代,即可创建一个随机字符串,作为用户的随机密码等。

01 /*************
02 *@l – length of random string
03 */
04 function generate_rand($l){
05 $c= “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789″;
06 srand((double)microtime()*1000000);
07 for($i=0; $i<$l; $i++) {
08 $rand.= $c[rand()%strlen($c)];
09 }
10 return $rand;
11 }

3. PHP编码电子邮件地址

使用此代码,可以将任何电子邮件地址编码为 html 字符实体,以防止被垃圾邮件程序收集。
01 function encode_email($email=’info@domain.com’, $linkText=’Contact Us’, $attrs =’class=”emailencoder”‘ )
02 {
03 // remplazar aroba y puntos
04 $email = str_replace(‘@’, ‘@’, $email);
05 $email = str_replace(‘.’, ‘.’, $email);
06 $email = str_split($email, 5);
07
08 $linkText = str_replace(‘@’, ‘@’, $linkText);
09 $linkText = str_replace(‘.’, ‘.’, $linkText);
10 $linkText = str_split($linkText, 5);
11
12 $part1 = ‘’;
15 $part4 = ‘
’;
16
17 $encoded = ‘’;
18 $encoded .= “[removed](‘$part1′);”;
19 $encoded .= “[removed](‘$part2′);”;
20 foreach($email as $e)
21 {
22 $encoded .= “[removed](‘$e’);”;
23 }
24 $encoded .= “[removed](‘$part3′);”;
25 foreach($linkText as $l)
26 {
27 $encoded .= “[removed](‘$l’);”;
28 }
29 $encoded .= “[removed](‘$part4′);”;
30 $encoded .= ‘’;
31
32 return $encoded;
33 }

4. PHP验证邮件地址

电子邮件验证也许是中最常用的网页表单验证,此代码除了验证电子邮件地址,也可以选择检查邮件域所属 DNS 中的 MX 记录,使邮件验证功能更加强大。

01 function is_valid_email($email, $test_mx = false)
02 {
03 if(eregi(“^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$”, $email))
04 if($test_mx)
05 {
06 list($username, $domain) = split(“@”, $email);
07 return getmxrr($domain, $mxrecords);
08 }
09 else
10 return true;
11 else
12 return false;
13 }

php算开始时间到过期时间的相隔的天数,同理可以实现相隔年,小时,分,秒等数
打印
1 //mktime = mktime($hours,minute,seconds,month,day,years)
2
3 $start_time = mktime(0,0,0,01,09,2010); //开始时间
4 $end_time = mktime(0,0,0,02,09,2010); //结束时间
5 $times = $end_time-$start_time; //开始与结束之间相差多少秒
6 $now_time = $times/(24*3600); //得出一共有多少
mktime得到的是秒为单位哦

2010-12-27

实现思路
1、将flash放到一个div(id暂且叫pdiv吧)里(swfObject就是这么做的) ;
2、给pdiv里加onmousedown事件,判断左右键,执行pdiv.setCaptrue()函数(让此事件被文档捕获,这样就不会触发flash的mouseEvent了^__^成功了)
3、如果你想在右击时让flash做点别的事,也可以在setCaptrue后加更多代码;
4、由于pdiv.setCaptrue()后,文档不会自动释放,也就是说flash的mouseEvent在setCaptrue之后就一直不会触发了,所以要在pdiv里再加个onmouseup事件,执行pdiv.releaseCapture()去手动释放;

代码如下:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=”http://www.w3.org/1999/xhtml“>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Yimin</title>
<script type=”text/javascript” src=”swfobject.js”></script>
<script type=”text/javascript”>
function NoRightClick(pid){//pid:flash’s parentNode id
var el = document.getElementById(pid);
if(el.addEventListener){
el.addEventListener(”mousedown”,function(event){
if(event.button == 2){
event.stopPropagation(); //for firefox
event.preventDefault();  //for chrome
}
},true);
}else{
el.attachEvent(”onmousedown”,function(){
if(event.button == 2){
el.setCapture();
}
});
el.attachEvent(”onmouseup”,function(){
el.releaseCapture();
});
el.oncontextmenu = function(){
return false;
};
}
};
</script>
</head>
<body>
<div id=”testContent” style=”width:800px”>
<embed id=”t1″ height=”780px” width=”750″ pluginspage=”http://www.adobe.com/go/getflashplayer” wmode=”opaque” menu=”false” allowscriptaccess=”sameDomain” algin=”middle” name=”t1″ quality=”high” bgcolor=”#000000″ src=”test.swf” type=”application/x-shockwave-flash”/>
</div>
<script type=”text/javascript”>
var so = new SWFObject(”test.swf”, “t1″, “800″, “550″, “9″, “#000000″);
so.addParam(”quality”, “high”);
so.addParam(”name”, “t1″);
so.addParam(”id”, “t1″);
so.addParam(”algin”, “middle”);
so.addParam(”AllowScriptAccess”, “sameDomain”);
so.addParam(”menu”, “false”);
so.addParam(”wmode”, “opaque”);
so.addParam(”pluginspage”, “http://www.adobe.com/go/getflashplayer“);
so.write(”testContent”);

NoRightClick(”testContent”);
</script>
</body>

MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法。
a. show tables或show tables from database_name; — 显示当前数据库中所有表的名称。
b. show tables like ‘my_%’; — 显示当前数据库中以my_开头的表。
c. show databases; — 显示mysql中所有数据库的名称。
d. show [full] columns from table_name from database_name; 或show [full] columns from database_name.table_name; — 显示表中列名称。
e. show grants for user_name; — 显示一个用户的权限,显示结果类似于grant 命令。
f. show index from table_name; — 显示表的索引。
g. show status;(show master status;show slave status) — 显示一些系统特定资源的信息,例如,正在运行的线程数量。
h. show variables; — 显示系统变量的名称和值。
i. show [full] processlist; — 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。
j. show table status; — 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。
k. show privileges; — 显示服务器所支持的不同权限。
l. show create database database_name; — 显示create database 语句是否能够创建指定的数据库。
m. show create table table_name; — 显示create database 语句是否能够创建指定的数据库。
n. show engies; — 显示安装以后可用的存储引擎和默认引擎。
o. show innodb status; — 显示innoDB存储引擎的状态。
p. show logs; — 显示BDB存储引擎的日志。
q. show warnings; — 显示最后一个执行的语句所产生的错误、警告和通知。
r. show errors; — 只显示最后一个执行语句所产生的错误。
s. show [storage] engines; –显示安装后的可用存储引擎和默认引擎。

一、系统自动备份脚本

1、/usr/local/mysql/bin/mysqldump –skip-extended-insert –default-character-set=gbk -uitravel -p9WJVsMQwVAhW5L6G itravelgo | gzip -c -
9 > /data/backup/db/itravelgo_`date +%y%m%d`.tar.gz

2、cd /data2/db/mysql
/etc/init.d/mysql.server stop
/bin/tar zcvf /data/backup/info_v2_`date +%Y%m%d`.tar.gz info_v2
/etc/init.d/mysql.server start

二、数据还原

mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据导入。

1、直接用 mysql 客户端

/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql

2、用 SOURCE 语法

SOURCE /tmp/db_name.sql;

图片防盗: 是不想自己的图片被别人使用。

图片防盗链: 是不想自己的图片被别人使用,且消耗的是自己的服务器流量。

图片防盗是困难的,完美的图片防盗那几乎是不可能的。但还是有很多方法能够减少图片盗用,下面是10种,选一种你喜欢的吧。

隐藏图片(使用空白图片覆盖真实图片)

Protect Images Background Method

这个方法可以让别人无法获取真实的图片,除非查看源代码。

你可以把真实的图片做为背景图片,而使用一张透明图片匹配尺寸并覆盖到真实图片上面。

例如:

<div id=”image1″ style=”background-image: url(originalImage.jpg);”>
<img src=”blank.gif” height=”250px” width=”300px”>
</div>

这样,当别人使用右键查看或保存图片的时候,得到的是这张透明图片。

这里是2个Javascript框架可以实现这种图片防盗链方法:

dwProtector for MooTools(http://davidwalsh.name/mootools-image-protector-dwprotector)

dwProtector for jQuery(http://davidwalsh.name/image-protector-plugin-for-jquery)

自动截切图片

Super Simple Image Tiles(http://supersimple.org/imagetiles/)

php Image Slicing

这是一个非常有效的图片防盗链方法。

它支持两种方案:

让用户下载到的是被裁切过的图片。

让用户下载到的是打上水印的图片。

当用户尝试下载图片的时候,它就会进行截切或添加水印操作,但是这个方法也有很大的劣势:

造成太多的服务器请求负荷,对网站整体性能影响不好

你将拥有许多的图片文件

使用带水印的图片 (预先生成)

预先给图片添加水印也是个防止图片被盗的有效方法,就算别人要盗,至少也为你免费宣传了一下自己的网站。

但缺点也来了:

图片会看的不清楚或不美观了(这对于图片展示类的网站尤其重要,但又正是该类网站特尤其图片防盗)

可以下载然后裁剪水印(当然,如果你是那种把水印放在图片中间或水印有图片这么1/3大的家伙,就不用担心这个问题了)

要手动添加水印的话,可以使用PhotoShop,GIMP,轻松水印等软件。也可以选择下面的一些在线图片水印工具:

PicMarkr(详细介绍)(http://parandroid.com/picmarkr-****-add-to-the-picture-watermarking-services/)

Online Watermarking

WatermarkTool(http://www.watermarktool.com/)

Online Watermark Website

使用水印 (服务器端生成)

使用服务器端自动为图片添加水印,是件省心的事情。只是需要一些脚本知识。

下面是一些相关的各种脚本语言的示例方案:

Asido: PHP Image Processing Library(http://asido.info/)

PHP Image Processing Library

Asido 是一个PHP图像处理库,可以运行于 GD2, Magick Wand 和 Image Magick.

这里 是 Asido 为图片添加水印的详细说明。

其它PHP 解决方案:

Put watermark on images using PHP(http://www.phpjabbers.com/put-watermark-on-images-using-php-php20.html)

Watermark your images with PHP 5 and GD(http://www.litewebsite.com/?c=19)

Watermark images on the fly in PHP(http://www.sitepoint.com/article/watermark-images-php/)

ASP。NET解决方案:

Thumbnail and watermark images on the fly with ASP.NET(http://www.dmxzone.com/ShowDetail.asp?NewsId=10287)

Watermarking Images in ASP.NET with an HttpHandler(http://blog.donnfelker.com/post/Watermarking-Images-in- ASPNET-with-an-HttpHandler.aspx)

CoolWatermark (paid)(http://www.imagecomponent.net/products/coolwatermark.aspx)

Ruby 解决方案:

RMagick(http://rmagick.rubyforge.org/)

Watermarking your images with RMagick(http://snippets.dzone.com/posts/show/6014)

P.S:俺偶尔良心发现的时候,会考虑一下版权问题: 这种自动添加水印的方法是为每一张力图片都添加水印,但是否有权利为每张图片都添加水印呢?除非所有的图片是自己原创。或许这也是国外给图片打水印的网站比较少的原因之一。

使用FLASH来显示图片

swfIR (详细介绍)(http://parandroid.com/swfir-to-increase-your-web-page-picture-variety-of-special-effects/)

swfIR

swf image replacement 可以让图片显示于Flash内部,让右键下载变的不可能。

并且,图片仍然可以使用CSS进行样式化。

缺点可想而知: 拖慢网页载入速度。

基于浏览器的图片防盗

禁用右键菜单(http://www.dynamicdrive.com/dynamicindex9/noright.htm)

Disable Right Click

通过JavaScript来禁用点键菜单 是图片防盗的一个方法,但它仅仅是对于网络菜鸟来说,中等点的网民可以很轻松的查看到代码获取图片地址,再高等点的可以轻松破解,禁用你的禁用!

所以这并不是一个好方法,更重要的是它是极不利于用户浏览体验的。

这有一个折中的方法,你可以通过一个jQuery 插件 来实现仅仅禁用保存功能。

禁用IE6的图像工具条

Disable IE6 Image Toolbar

在IE6下,当鼠标悬浮在一张图片上时,会出现工具条,上面有保存功能,你可以使用下面的代码禁用:

<meta http-equiv=”imagetoolbar” content=”no”>

你还有其它图片防盗的方法吗? 欢迎分享。

从文件内容查找匹配指定字符串的行:
$ grep “被查找的字符串” 文件名
从文件内容查找与正则表达式匹配的行:
$ grep –e “正则表达式” 文件名
查找时不区分大小写:
$ grep –i “被查找的字符串” 文件名
查找匹配的行数:
$ grep -c “被查找的字符串” 文件名
从文件内容查找不匹配指定字符串的行:
$ grep –v “被查找的字符串” 文件名
从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行
find / -type f -name “*.log” | xargs grep “ERROR”

1) $inc

用法:{ $inc : { field : value } }

意思对一个数字字段field增加value,例:

> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 16, “test1″ : “TESTTEST”, “test2″ : “OK”, “test3″ : “TESTTEST”, “test4″ : “OK”, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $inc : { “count” : 1 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 17, “test1″ : “TESTTEST”, “test2″ : “OK”, “test3″ : “TESTTEST”, “test4″ : “OK”, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $inc : { “count” : 2 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 19, “test1″ : “TESTTEST”, “test2″ : “OK”, “test3″ : “TESTTEST”, “test4″ : “OK”, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $inc : { “count” : -1 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : “TESTTEST”, “test2″ : “OK”, “test3″ : “TESTTEST”, “test4″ : “OK”, “test5″ : “OK” }

2) $set

用法:{ $set : { field : value } }

就是相当于sql的set field = value,全部数据类型都支持$set。例:
> db.test0.update( { “_id” : 15 } , { $set : { “test1″ : “testv1″,”test2″ : “testv2″,”test3″ : “testv3″,”test4″ : “testv4″ } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : “testv1″, “test2″ : “testv2″, “test3″ : “testv3″, “test4″ : “testv4″, “test5″ : “OK” }

3) $unset

用法:{ $unset : { field : 1} }

顾名思义,就是删除字段了。例:
> db.test0.update( { “_id” : 15 } , { $unset : { “test1″:1 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test2″ : “testv2″, “test3″ : “testv3″, “test4″ : “testv4″, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $unset : { “test2″: 0 } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test3″ : “testv3″, “test4″ : “testv4″, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $unset : { “test3″:asdfasf } } );
Fri May 14 16:17:38 JS Error: ReferenceError: asdfasf is not defined (shell):0

> db.test0.update( { “_id” : 15 } , { $unset : { “test3″:”test” } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test4″ : “testv4″, “test5″ : “OK” }

没看出field : 1里面的1是干什么用的,反正只要有东西就行。

4) $push

用法:{ $push : { field : value } }

把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。例:

> db.test0.update( { "_id" : 15 } , { $set : { "test1" : ["aaa","bbb"] } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "aaa", "bbb" ], "test4" : "testv4", "test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $push : { "test1": "ccc" } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "aaa", "bbb", "ccc" ], "test4" : "testv4", "test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $push : { "test2": "ccc" } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "aaa", "bbb", "ccc" ], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $push : { "test1": ["ddd","eee"] } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "aaa", "bbb", "ccc", [ "ddd", "eee" ] ], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }

5) $pushAll

用法:{ $pushAll : { field : value_array } }

同$push,只是一次可以追加多个值到一个数组字段内。例:

> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "aaa", "bbb", "ccc", [ "ddd", "eee" ] ], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }

> db.test0.update( { “_id” : 15 } , { $pushAll : { “test1″: ["fff","ggg"] } } );
> db.test0.find( { “_id” : 15 } );
{ “_id” : { “floatApprox” : 15 }, “count” : 18, “test1″ : [ "aaa", "bbb", "ccc", [ "ddd", "eee" ], “fff”, “ggg” ], “test2″ : [ "ccc" ], “test4″ : “testv4″, “test5″ : “OK” }

6) $addToSet

用法:{ $addToSet : { field : value } }

增加一个值到数组内,而且只有当这个值不在数组内才增加。例:> db.test0.update( { "_id" : 15 } , { $addToSet : { "test1": {$each : ["444","555"] } } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [        "aaa",        "bbb",        "ccc",        [                "ddd",                "eee"        ],        "fff",        "ggg",        [                "111",                "222"        ],        "444",        "555"], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }> db.test0.update( { "_id" : 15 } , { $addToSet : { "test1": {$each : ["444","555"] } } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [        "aaa",        "bbb",        "ccc",        [                "ddd",                "eee"        ],        "fff",        "ggg",        [                "111",                "222"        ],        "444",        "555"], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }> db.test0.update( { "_id" : 15 } , { $addToSet : { "test1": ["444","555"]  } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [        "aaa",        "bbb",        "ccc",        [                "ddd",                "eee"        ],        "fff",        "ggg",        [                "111",                "222"        ],        "444",        "555",        [                "444",                "555"        ]], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }> db.test0.update( { "_id" : 15 } , { $addToSet : { "test1": ["444","555"]  } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [        "aaa",        "bbb",        "ccc",        [                "ddd",                "eee"        ],        "fff",        "ggg",        [                "111",                "222"        ],        "444",        "555",        [                "444",                "555"        ]], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }

7) $pop

删除数组内的一个值

用法:删除最后一个值:{ $pop : { field : 1  } }
删除第一个值:{ $pop : { field : -1  } }

注意,只能删除一个值,也就是说只能用1或-1,而不能用2或-2来删除两条。mongodb 1.1及以后的版本才可以用,例:> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [        "bbb",        "ccc",        [                "ddd",                "eee"        ],        "fff",        "ggg",        [                "111",                "222"        ],        "444"], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }> db.test0.update( { "_id" : 15 } , { $pop : { "test1": -1 } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [        "ccc",        [                "ddd",                "eee"        ],        "fff",        "ggg",        [                "111",                "222"        ],        "444"], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }> db.test0.update( { "_id" : 15 } , { $pop : { "test1": 1 } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "ccc", [ "ddd", "eee" ], "fff", "ggg", [ "111", "222" ] ], "test2" : [ "ccc" ], "test4" : "testv4","test5" : "OK" }

 8) $pull

用法:$pull : { field : value } }

从数组field内删除一个等于value值。例:> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "ccc", [ "ddd", "eee" ], "fff", "ggg", [ "111", "222" ] ], "test2" : [ "ccc" ], "test4" : "testv4","test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $pull : { "test1": "ggg" } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "ccc", [ "ddd", "eee" ], "fff", [ "111", "222" ] ], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }

9) $pullAll

用法:{ $pullAll : { field : value_array } }

同$pull,可以一次删除数组内的多个值。例:> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "ccc", [ "ddd", "eee" ], "fff", [ "111", "222" ] ], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $pullAll : { "test1": [ "ccc" , "fff" ] } } );> db.test0.find( { "_id" : 15 } );{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ [ "ddd", "eee" ], [ "111", "222" ] ], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }

10) $ 操作符$是他自己的意思,代表按条件找出的数组里面某项他自己。呵呵,比较坳口。看一下官方的例子:

> t.find(){ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",  "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }

> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )

> t.find(){ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",  "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }

需要注意的是,$只会应用找到的第一条数组项,后面的就不管了。还是看例子:

> t.find();{ "_id" : ObjectId("4b9e4a1fc583fa1c76198319"), "x" : [ 1, 2, 3, 2 ] }> t.update({x: 2}, {$inc: {"x.$": 1}}, false, true);> t.find();

还有注意的是$配合$unset使用的时候,会留下一个null的数组项,不过可以用{$pull:{x:null}}删除全部是null的数组项。例:> t.insert({x: [1,2,3,4,3,2,3,4]})> t.find(){ "_id" : ObjectId("4bde2ad3755d00000000710e"), "x" : [ 1, 2, 3, 4, 3, 2, 3, 4 ] }> t.update({x:3}, {$unset:{"x.$":1}})> t.find(){ "_id" : ObjectId("4bde2ad3755d00000000710e"), "x" : [ 1, 2, null, 4, 3, 2, 3, 4 ] }

{ "_id" : ObjectId("4b9e4a1fc583fa1c76198319"), "x" : [ 1, 3, 3, 2 ] }

mongodb更新有两个命令:

1).update()命令

db.collection.update( criteria, objNew, upsert, multi )

criteria : update的查询条件,类似sql update查询内where后面的
objNew   : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
upsert   : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi    : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

例:
db.test0.update( { “count” : { $gt : 1 } } , { $set : { “test2″ : “OK”} } ); 只更新了第一条记录
db.test0.update( { “count” : { $gt : 3 } } , { $set : { “test2″ : “OK”} },false,true ); 全更新了
db.test0.update( { “count” : { $gt : 4 } } , { $set : { “test5″ : “OK”} },true,false ); 只加进去了第一条
db.test0.update( { “count” : { $gt : 5 } } , { $set : { “test5″ : “OK”} },true,true ); 全加进去了
db.test0.update( { “count” : { $gt : 15 } } , { $inc : { “count” : 1} },false,true );全更新了
db.test0.update( { “count” : { $gt : 10 } } , { $inc : { “count” : 1} },false,false );只更新了第一条

2).save()命令

db.collection.save( x )

x就是要更新的对象,只能是单条记录。

如 果在collection内已经存在一个和x对象相同的”_id”的记录。mongodb就会把x对象替换collection内已经存在的记录,否则将 会插入x对象,如果x内没有_id,系统会自动生成一个再插入。相当于上面update语句的upsert=true,multi=false的情况。

例:
db.test0.save({count:40,test1:”OK”}); #_id系统会生成
db.test0.save({_id:40,count:40,test1:”OK”}); #如果test0内有_id等于40的,会替换,否则插入。