我永远不会试图去战胜一个纯傻逼,因为他会用他丰富的经验来打败我...

分类目录
3月 21

Windows 下nginx+php cUrl请求卡死的问题

缘由:         
    接手的新项目, 使用 Laravel 框架 ,有一个接口请求控制器使用的是 Guzzle HTTP客户端请求组件,开始用的时候,发现一直处于卡死, 直到 nginx 返回 504 Time Out ,并且请求的本地 api 服务器, 也没有请求日志,api 是可以确保在正常运行的。同时,线上的 api 地址就可以正常请求。所以,可以判断出代码是正常的,同时请求没有发出。 

    一开始以为是 这个组件的问题导致请求没有发出, 还去 gayhub 提 Issues , 结果被告知不是 Guzzle 的问题, 就被 close 掉了。 后来,隔了几天作者给我分析了一波,已下是原话。  第一次,没看明白这个功能也不是特别急,也就闲置了。    

The returned response indicates that your server responded, this the request itself is successful。 The response code indicates that something went wrong on server side (most probably your nginx server couldn’t connect to php-fpm)。 The fact that it works locally is irrelevant in this case as the problem is on the server side。

    现在,又要解决这个问题的时候, 想着把情况具体在说明一下,请教一下有么有办法解决,但是,这个时候我又看到他括号里的话 (most probably your nginx server couldn’t connect to php-fpm) 。所以,我就怀疑是不是 nginx的配置问题。

    

    由于,本人对 nginx 也不是特别熟悉。随即, 去 Google 了一下 nginx 和 php 的组合配置, 发现 Windows 环境下 nginx + php ,不支持并发。也就是,当本地配置了多个域名,并且同时指向你本地服务请求的时候,就不支持了。


    于是一个解决办法就是 修改 fastcgi_pass=127.0.0.1:9000 的配置, 这个配置 表示 nginx 会通过 fastcgi_pass 将请求的资源发给 127.0.0.1:9000 进行解析。 

    我这里有两个服务,所以分别配置成不同的端口号如,然后保存重启 nginx。 

fastcgi_pass = 127.0.0.1:9000
fastcgi_pass  = 127.0.0.1:9001

   在同时,在 cmd 下开启多个 php-cgi 指向 php.ini 进行监听。

  

你的php目录/php-cgi.exe -b 127.0.0.1:9000 -c 你的php目录/php.ini
你的php目录/php-cgi.exe -b 127.0.0.1:9001 -c 你的php目录/php.ini

    然后, 就能完美的解决问题了。


    这种问题也是因为,自身对 nginx 和 php 的配置不够熟悉。。


    在以后还是要多多学习!


   

9月 14

记一次链接远程数据的问题。

原文,https://segmentfault.com/q/1010000011165688 提示的问题。

辅助文章: http://www.jb51.net/article/58096.htm

https://dev.mysql.com/doc/refman/5.6/en/connection-access.html

最后通过查询mysql->user表发现,就是用户名相同,host主机来源不同,所使用的密码也是不相同,这是个天坑

8月 26

MySQL中tinytext、text、mediumtext和longtext详解

一、字符串类型

类型
范围
说明
 
Char(N) [ binary] N=1~255 个字节
binary :分辨大小写
固定长度 std_name cahr(32) not null
VarChar(N) [binary] N=1~255 个字节
binary :分辨大小写
可变长度 std_address varchar(256)
TinyBlob 最大长度255个字节(2^8-1)

Blob (Binary large objects)储存二进位资料,且有分大小写

memo text not null
TinyText 最大长度255个字节(2^8-1)
Blob 最大长度65535个字节(2^16-1)
 Text 最大长度65535个字节(2^16-1)
MediumBlob 最大长度 16777215 个字节(2^24-1)
MediumText 最大长度 16777215 个字节(2^24-1
LongBlob 最大长度4294967295个字节 (2^32-1)
LongText 最大长度4294967295个字节 (2^32-1)
Enum 集合最大数目为65535 列举(Enumeration),Enum单选、Set复选 sex enum(1,0)
habby set(‘玩电玩’,’睡觉’,’看电影’,’听音乐’)
Set 集合最大数目为64

辨別Null与Not Null :Null为允许储存空值(Null)

二、数字/数值类型

类型
范围
说明
例如
TinyInt[M] [UNSIGNED] -128~127
UNSIGNED : 0~255
  num tinyint unsigned
SmallInt[M] [UNSIGNED] -32768~32767
UNSIGNED :0~ 65535
   
MediumInt[M] [UNSIGNED] -8388608~8388607
UNSIGNED :0~16777215
   
Int[M] [UNSIGNED] -2^31~2^31-1
UNSIGNED : 0~2^32
   
BigInt[M] [UNSIGNED] -2^63~2^63-1
UNSIGNED : 0~2^64
   
Float [(M,D)]

-3.4E+38~3.4E+38( 约 )

注: M 为长度, D 为小数,Float 4 bytes,Double 8 bytes  
Double [(M,D)] -1.79E+308~1.79E+308( 约 )
Decimal [(M,D)]  

辨別ZeroFill:当宣告关键字ZeroFill为自动填满0,如 000021

三、日期时间类型

类型
范围
说明
Date 日期(yyyy-mm-dd)  
Time 时间(hh:mm:ss)  
DateTime 日期与时间組合(yyyy-mm-dd hh:mm:ss)  
TimeStamp yyyymmddhhmmss  
Year

年份yyyy

7月 04

远程连接mysql数据

看了网上很多方式都是复制粘贴的,步骤都漏了, 我这里补充一下

2、授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。 

这里前提先  use user表. 才能执行,否则报错

Error (1133): Can’t find any matching row in the user table

GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@’%’IDENTIFIED BY ‘mypassword’ WITH GRANT OPTION; 
如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码 
GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@’192.168.1.3’IDENTIFIED BY ‘mypassword’ WITH GRANT OPTION; 
我用的第一个方法,刚开始发现不行,在网上查了一下,少执行一个语句 mysql>FLUSH RIVILEGES 
使修改生效,就可以了 
第三种方法: 
在安装mysql的机器上运行: 
1、d:\mysql\bin\>mysql -h localhost -uroot 

//这样应该可以进入MySQL服务器 

2、use user;

//使用user表再继续操作

3、mysql>GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ IDENTIFIED BY ‘root’ WITH GRANT OPTION;
//赋予任何主机访问数据的权限 并使用root密码登录
4、mysql>FLUSH PRIVILEGES 
//修改生效 
5、mysql>EXIT 
//退出MySQL服务器 
这样就可以在其它任何的主机上以root身份登录啦。

2月 28

Nginx 一个服务器多域名配置

今天刚刚入手了一台腾讯云的服务器,想着。正好做两个视频/音乐站。于是就有了下面的内容。

1.环境,为了方便直接使用lnmp 一键安装包安装成 http://lnmp.org/install.html

安装完成后Nginx 配置在 /usr/local/nginx/conf/nginx.conf  在 /usr/local/nginx/conf 文件夹下 有一个 vhost 文件

之所以提到这个文件是因为配置中有一行 include vhost/*.conf; 表示他会引入所有 vhost 下 .conf 后缀的文件 nginx 路由可以通过这种引用进行设置.

2.在/usr/local/nginx/conf/vhost 下可以新建两个或者一个 domain.conf   我喜欢一个域名一个文件,看着舒服所以我就新建了两个。

music.conf 和 video.conf 里面分别写

server
{
    listen 80;  //端口号
    server_name music.ishwy.me;  //你的域名
    index index.php index.htm index.html;   //默认访问文件类型
    root /home/wwwroot/default/music;   //网站目录路径
    include enable-php.conf;    //解析php文件的作用
}
server
{
    listen 80;  //端口号
    server_name video.ishwy.me;  //你的域名
    index index.php index.htm index.html;   //默认访问文件类型
    root /home/wwwroot/default/video;   //网站目录路径
    include enable-php.conf;    //解析php文件的作用
}

如果想就放在一个文件里,就只要把上面两段话复制到一个文件就行啦。看个人习惯


然后访问

music.ishwy.me 的时候就会访问到 ../music的目录下

video.ishwy.me 的时候就会访问到 ../video的目录下

配置好后还要重启一下nginx,命令如下。重启如果没有什么报错,就说明重启成功了。然后就能愉快的访问了,跟Apache一样滴简单。【滑稽】

cd /usr/local/nginx/sbin
./nginx -s reload



2月 25

php $_SERVER中的SERVER_NAME 和HTTP_HOST的区别

最近做项目中,因为要取到$_SERVER[‘SERVER_NAME’].$_SERVER[‘REQUEST_URI’]获取域名及请求的URL的问题。
结果在当两个域名都指向了同一个服务器的时候,就出现了问题,就是我通过B域名访问,打印$_SERVER[“SERVER_NAME”] 出来的确是A域名的地址。这点就让我很奇怪,导致了支付的回调也无法走下去。
后来我打印了$_SERVER查询了一下之后,发现还有一个$_SERVER[‘HTTP_HOST’]。发现那个正是我的想要的结果。
所以我推测 $_SERVER[‘SERVER_NAME’] 是取到的conf文件中的 配置。因为的 server_name 配置了两个,a.com b.com,就近原则,先读取了a.com
下面通过自己的操作和资料得出如下结论。

相同点:
当满足以下三个条件时,两者会输出相同信息。
1. 服务器为80端口
2. apache的conf中ServerName设置正确
3. HTTP/1.1协议规范

不同点:
1. 通常情况:
$_SERVER[“HTTP_HOST”] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。
$_SERVER[“SERVER_NAME”] 默认情况下直接输出web服务器的的配置文件中的ServerName值。

2. 当服务器为非80端口时:
$_SERVER[“HTTP_HOST”] 会输出端口号,例如:mimiz.cn:8080
$_SERVER[“SERVER_NAME”] 会直接输出ServerName值
因此在这种情况下,可以理解为:HTTP_HOST = SERVER_NAME : SERVER_PORT

3. 当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时:
httpd.conf配置如下:

ServerName mimiz.cn
ServerAlias www.mimiz.cn

客户端访问域名www.mimiz.cn
_SERVER[“HTTP_HOST”] 输出 www.mimiz.cn
_SERVER[“SERVER_NAME”] 输出 mimiz.cn

所以,在实际程序中,应尽量使用_SERVER[“HTTP_HOST”] ,比较保险和可靠。

2月 06

linux –编译安装lamp

Linux安装配置apache

1.获取软件: http://httpd.apache.org/ httpd-2.2.21.tar.gz
2.安装步骤:
解压源文件:
1 tar zvxf httpd-2.2.21.tar.gz 2 cd httpd-2.2.21 3 ./configure –prefix=/usr/local/apache2 –enable-so –enable-rewrite 4 make 5 make install
运行./configure 命令进行编译源代码,
–prefix=/usr/local/apach2 是设置编译安装到的系统目录,
–enable-s 参数是使httpd服务能够动态加载模块功能,
–enable-rewrite 是使httpd服务具有网页地址重写功能。
3.启动apache:
/usr/local/apache2/bin/apachectl start
4.将apache加入到系统服务,用service命令来控制apache的启动和停止
首先以apachectl脚本为模板生成Apache服务控制脚本:
grep -v “#” /usr/local/apache2/bin/apachectl > /etc/init.d/apache
用vi编辑Apache服务控制脚本/etc/init.d/apache:
vi /etc/init.d/apache
在文件最前面插入下面的行,使其支持chkconfig命令:
#!/bin/sh
# chkconfig: 2345 85 15
# description: Apache is a World Wide Web server.
保存后退出vi编辑器,执行下面的命令增加Apache服务控制脚本执行权限:
chmod +x /etc/init.d/apache
执行下面的命令将Apache服务加入到系统服务:
chkconfig –add apache
执行下面的命令检查Apache服务是否已经生效:
chkconfig –list apache
命令输出类似下面的结果:
apache 0:off 1:off 2:on 3:on 4:on 5:on 6:off
表明apache服务已经生效,在2、3、4、5运行级别随系统启动而自动启动,以后可以使用service命令控制Apache的启动和停止。
启动Apache服务: service apache start
停止Apache服务: service apache stop
执行下面的命令关闭开机自启动: chkconfig apache off

Linux安装配置php

1.获取安装文件: http://www.php.net/downloads.php php-5.3.8.tar.gz
获取安装php需要的支持文件:http://download.csdn.net/download/netlong339/1351852 libxml2-2.6.32.tar.gz
2.安装libxml2
1 tar zxvf libxml2-2.6.32.tar.gz 2 cd libxml2-2.6.32 3 ./configure –prefix=/usr/local/libxml2 4 make 5 make install
如果安装成功以后,在/usr/local/libxml2 /目录下将生成bin、include、lib、man和share五个目录。在后面安装PHP5源代码包的配置时,会通过在configure命令的选 项中加上”–with-libxml-dir=/usr/ local/libxml2″选项,用于指定安装libxml2库文件的位置。
3.安装php5
复制代码
#tar zvxf php-5.3.8.tar.gz
#cd php-5.3.8 #./configure \
–prefix=/usr/local/php \
–with-mysql=/usr/local/mysql \
–with-apxs=/usr/local/apache2/bin/apxs \
–with-libxml-dir=/usr/ local/libxml2
#make
#make install
复制代码
4.重新配置apache2让他支持php
配置 httpd.conf 让apache支持PHP:
# vi /usr/local/apache/conf/httpd.conf
找到 AddType application/x-gzip .gz .tgz 在其下添加如下内容
AddType application/x-httpd-php .php (.前面有空格)
AddType application/x-httpd-php-source .phps (.前面有空格)
然后CPOPY PHP的配置文件
cp php-5.3.8/php.ini.dist /usr/local/php/lib/php.ini
(如果没有php.ini.dist 则把php.ini-development php.ini-production中的任何一个重命名为php.ini.dist即可。)
修改php.ini文件 register_globals = On
重启apache
service apache restart
5.测试php是否成功安装
写一个php测试页info.php,放到apache2/htdocs中。
;
在浏览器中输入:服务器地址/info.php
如果能正常显示出php的信息,则说明Apche+Mysql+PHP安装成功!

2月 06

Centos7.0桥接配置上网

虚拟机—虚拟网络编辑器 选择桥接模式—->桥接到自己的网卡

Centos网卡配置::
/etc/sysconfig/network-scripts/ifcfg-eno167736
ifcfg-eno*** 的数字好像是随机生成的

vi ifcfg-eno16777736
新增 APADDR NETWORK GATEWAY DNS 设置和起网卡一个网段 并把最后的ONBOOT=yes开启
这里在提一下 vi 的基本操作,首先
输入 I 进入插入Insert 模式
然后出现光标写入就行,写完之后
ESC 退出 进入命令行
:wq 保存并退出

然后重启网卡: service network restart 就妥了

明天安装LNMP吧

2月 06

linux查看和修改PATH环境变量的方法

查看PATH:echo $PATH
以添加php5.6 server为列
修改方法一:
export PATH=/usr/local/php5.6/bin:$PATH
//配置完后可以通过echo $PATH查看配置结果。
生效方法:立即生效
有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置
用户局限:仅对当前用户

修改方法二:
通过修改.bashrc文件:
vim ~/.bashrc
//在最后一行添上:
export PATH=/usr/local/php5.6/bin:$PATH
生效方法:(有以下两种)
1、关闭当前终端窗口,重新打开一个新终端窗口就能生效
2、输入“source ~/.bashrc”命令,立即生效
有效期限:永久有效
用户局限:仅对当前用户

修改方法三:
通过修改profile文件:
vim /etc/profile
/export PATH //找到设置PATH的行,添加
export PATH=/usr/local/php5.6/bin:$PATH
生效方法:系统重启
有效期限:永久有效
用户局限:对所有用户

修改方法四:
通过修改environment文件:
vim /etc/environment
在PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games”中加入“:/usr/local/php5.6/bin”
生效方法:系统重启
有效期限:永久有效
用户局限:对所有用户

2月 06

php操作MongoDB常用命令

转载
如:如果你想创建一个“myTest”的数据库,先运行use myTest命令,之后就做一些操作(如:db.createCollection(‘user’)),这样就可以创建一个名叫“myTest”的数据库。

一、数据库常用命令
1、Help查看命令提示
复制代码代码如下:
help
db.help();
db.yourColl.help();
db.youColl.find().help();
rs.help();

2、切换/创建数据库
复制代码代码如下:
use yourDB; 当创建一个集合(table)的时候会自动创建当前数据库

3、查询所有数据库
复制代码代码如下:
show dbs;

4、删除当前使用数据库
复制代码代码如下:
db.dropDatabase();

5、从指定主机上克隆数据库
复制代码代码如下:
db.cloneDatabase(“127.0.0.1”); 将指定机器上的数据库的数据克隆到当前数据库

6、从指定的机器上复制指定数据库数据到某个数据库
复制代码代码如下:
db.copyDatabase(“mydb”, “temp”, “127.0.0.1”);将本机的mydb的数据复制到temp数据库中

7、修复当前数据库
复制代码代码如下:
db.repairDatabase();

8、查看当前使用的数据库
复制代码代码如下:
db.getName();
db; db和getName方法是一样的效果,都可以查询当前使用的数据库

9、显示当前db状态
复制代码代码如下:
db.stats();

10、当前db版本
复制代码代码如下:
db.version();

11、查看当前db的链接机器地址
复制代码代码如下:
db.getMongo();
二、Collection聚集集合
1、创建一个聚集集合(table)
复制代码代码如下:
db.createCollection(“collName”, {size: 20, capped: 5, max: 100});//创建成功会显示{“ok”:1}
//判断集合是否为定容量db.collName.isCapped();

2、得到指定名称的聚集集合(table)
复制代码代码如下:
db.getCollection(“account”);

3、得到当前db的所有聚集集合
复制代码代码如下:
db.getCollectionNames();

4、显示当前db所有聚集索引的状态
复制代码代码如下:
db.printCollectionStats();

三、用户相关
1、添加一个用户
复制代码代码如下:
db.addUser(“name”);
db.addUser(“userName”, “pwd123”, true); 添加用户、设置密码、是否只读

2、数据库认证、安全模式
复制代码代码如下:
db.auth(“userName”, “123123”);

3、显示当前所有用户
复制代码代码如下:
show users;

4、删除用户
复制代码代码如下:
db.removeUser(“userName”);

四、聚集集合查询
1、查询所有记录
复制代码代码如下:
db.userInfo.find();
相当于:select* from userInfo;

默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”
但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。
2、查询去掉后的当前聚集集合中的某列的重复数据
复制代码代码如下:
db.userInfo.distinct(“name”);
会过滤掉name中的相同数据
相当于:select distict name from userInfo;

3、查询age = 22的记录
复制代码代码如下:
db.userInfo.find({“age”: 22});
相当于: select * from userInfo where age = 22;

4、查询age > 22的记录
复制代码代码如下:
db.userInfo.find({age: {$gt: 22}});
相当于:select * from userInfo where age >22;

5、查询age < 22的记录 复制代码代码如下: db.userInfo.find({age: {$lt: 22}}); 相当于:select * from userInfo where age <22; 6、查询age >= 25的记录
复制代码代码如下:
db.userInfo.find({age: {$gte: 25}});
相当于:select * from userInfo where age >= 25;

7、查询age <= 25的记录 复制代码代码如下: db.userInfo.find({age: {$lte: 25}}); 8、查询age >= 23 并且 age <= 26 复制代码代码如下: db.userInfo.find({age: {$gte: 23, $lte: 26}}); 9、查询name中包含 mongo的数据 复制代码代码如下: db.userInfo.find({name: /mongo/}); //相当于%% [code]select * from userInfo where name like ‘%mongo%'; 10、查询name中以mongo开头的 复制代码代码如下: db.userInfo.find({name: /^mongo/}); select * from userInfo where name like ‘mongo%'; 11、查询指定列name、age数据 复制代码代码如下: db.userInfo.find({}, {name: 1, age: 1}); 相当于:select name, age from userInfo; 当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。 12、查询指定列name、age数据, age > 25
复制代码代码如下:
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
相当于:select name, age from userInfo where age >25;

13、按照年龄排序
复制代码代码如下:
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});

14、查询name = zhangsan, age = 22的数据
复制代码代码如下:
db.userInfo.find({name: ‘zhangsan’, age: 22});
相当于:select * from userInfo where name = ‘zhangsan’ and age = ‘22′;

15、查询前5条数据
复制代码代码如下:
db.userInfo.find().limit(5);
相当于:selecttop 5 * from userInfo;

16、查询10条以后的数据
复制代码代码如下:
db.userInfo.find().skip(10);
相当于:select * from userInfo where id not in (
selecttop 10 * from userInfo
);

17、查询在5-10之间的数据
复制代码代码如下:
db.userInfo.find().limit(10).skip(5);

可用于分页,limit是pageSize,skip是第几页*pageSize
18、or与 查询
复制代码代码如下:
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
相当于:select * from userInfo where age = 22 or age = 25;

19、查询第一条数据
复制代码代码如下:
db.userInfo.findOne();
相当于:selecttop 1 * from userInfo;
db.userInfo.find().limit(1);

20、查询某个结果集的记录条数
复制代码代码如下:
db.userInfo.find({age: {$gte: 25}}).count();
相当于:select count(*) from userInfo where age >= 20;

21、按照某列进行排序
复制代码代码如下:
db.userInfo.find({sex: {$exists: true}}).count();
相当于:select count(sex) from userInfo;

五、索引
1、创建索引
复制代码代码如下:
db.userInfo.ensureIndex({name: 1});
db.userInfo.ensureIndex({name: 1, ts: -1});

2、查询当前聚集集合所有索引
复制代码代码如下:
db.userInfo.getIndexes();

3、查看总索引记录大小
复制代码代码如下:
db.userInfo.totalIndexSize();

4、读取当前集合的所有index信息
复制代码代码如下:
db.users.reIndex();

5、删除指定索引
复制代码代码如下:
db.users.dropIndex(“name_1”);

6、删除所有索引索引
复制代码代码如下:
db.users.dropIndexes();

六、修改、添加、删除集合数据
1、添加
复制代码代码如下:
db.users.save({name: ‘zhangsan’, age: 25, sex: true});

添加的数据的数据列,没有固定,根据添加的数据为准
2、修改
复制代码代码如下:
db.users.update({age: 25}, {$set: {name: ‘changeName’}}, false, true);
相当于:update users set name = ‘changeName’ where age = 25;
db.users.update({name: ‘Lisi’}, {$inc: {age: 50}}, false, true);
相当于:update users set age = age + 50 where name = ‘Lisi’;
db.users.update({name: ‘Lisi’}, {$inc: {age: 50}, $set: {name: ‘hoho’}}, false, true);
相当于:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’;

3、删除
复制代码代码如下:
db.users.remove({age: 132});

4、查询修改删除
复制代码代码如下:
db.users.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: ‘a2’}, $inc: {age: 2}},
remove: true
});
db.runCommand({ findandmodify : “users”,
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: ‘a2’}, $inc: {age: 2}},
remove: true
});

update 或 remove 其中一个是必须的参数; 其他参数可选。
参数 详解 默认值
query 查询过滤条件 {}
sort 如果多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象,该对象将被操作 {}
remove 若为true,被选中对象将在返回前被删除 N/A
update 一个 修改器对象
N/A
new 若为true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略。 false
fields 参见Retrieving a Subset of Fields (1.5.0+)
All fields
upsert 创建新对象若查询结果为空。 示例 (1.5.4+)
false
七、语句块操作
1、简单Hello World
复制代码代码如下:
print(“Hello World!”);

这种写法调用了print函数,和直接写入”Hello World!”的效果是一样的;
2、将一个对象转换成json
复制代码代码如下:
tojson(new Object());
tojson(new Object(‘a’));

3、循环添加数据
复制代码代码如下:
> for (var i = 0; i < 30; i++) { ... db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2}); ... }; 这样就循环添加了30条数据,同样也可以省略括号的写法 复制代码代码如下: > for (var i = 0; i < 30; i++) db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2}); 也是可以的,当你用db.users.find()查询的时候,显示多条数据而无法一页显示的情况下,可以用it查看下一页的信息; 4、find 游标查询 复制代码代码如下: >var cursor = db.users.find();
> while (cursor.hasNext()) {
printjson(cursor.next());
}

这样就查询所有的users信息,同样可以这样写
复制代码代码如下:
var cursor = db.users.find();
while (cursor.hasNext()) { printjson(cursor.next); }

同样可以省略{}号
5、forEach迭代循环
复制代码代码如下:
db.users.find().forEach(printjson);

forEach中必须传递一个函数来处理每条迭代的数据信息
6、将find游标当数组处理
复制代码代码如下:
var cursor = db.users.find();
cursor[4];

取得下标索引为4的那条数据
既然可以当做数组处理,那么就可以获得它的长度:cursor.length();或者cursor.count();
那样我们也可以用循环显示数据
复制代码代码如下:
for (var i = 0, len = c.length(); i < len; i++) printjson(c[i]); 7、将find游标转换成数组 复制代码代码如下: > var arr = db.users.find().toArray();
> printjson(arr[2]);

用toArray方法将其转换为数组
8、定制我们自己的查询结果
只显示age <= 28的并且只显示age这列数据 复制代码代码如下: db.users.find({age: {$lte: 28}}, {age: 1}).forEach(printjson); db.users.find({age: {$lte: 28}}, {age: true}).forEach(printjson); 排除age的列 复制代码代码如下: db.users.find({age: {$lte: 28}}, {age: false}).forEach(printjson); 9、forEach传递函数显示信息 复制代码代码如下: db.things.find({x:4}).forEach(function(x) {print(tojson(x));}); 八、其他 1、查询之前的错误信息 复制代码代码如下: db.getPrevError(); 2、清除错误记录 复制代码代码如下: db.resetError(); 查看聚集集合基本信息 1、查看帮助 db.yourColl.help(); 2、查询当前集合的数据条数 db.yourColl.count(); 3、查看数据空间大小 db.userInfo.dataSize(); 4、得到当前聚集集合所在的db db.userInfo.getDB(); 5、得到当前聚集的状态 db.userInfo.stats(); 6、得到聚集集合总大小 db.userInfo.totalSize(); 7、聚集集合储存空间大小 db.userInfo.storageSize(); 8、Shard版本信息 db.userInfo.getShardVersion() 9、聚集集合重命名 db.userInfo.renameCollection("users"); 将userInfo重命名为users 10、删除当前聚集集合 db.userInfo.drop(); 复制代码代码如下: show dbs:显示数据库列表 show collections:显示当前数据库中的集合(类似关系数据库中的表) show users:显示用户 use :切换当前数据库,这和MS-SQL里面的意思一样
db.help():显示数据库操作命令,里面有很多的命令
db.foo.help():显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令
db.foo.find():对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据)
db.foo.find( { a : 1 } ):对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1