1. mongoDB安装、启动、关闭
1.1 下载安装包
1
|
wget http:
//fastdl
.mongodb.org
/linux/mongodb-linux-x86_64-3
.0.3.tgz
|
1.2 解压,移动到/usr/local/mongodb目录
1
|
tar
-zxvf mongodb-linux-x86_64-3.0.3.tgz
|
1
|
sudo
mv
mongodb-linux-x86_64-3.0.3
/usr/local/mongodb
|
1.3 目录说明
1
|
cd
/usr/local/mongodb
|
1.3.1 目录bin
其下的mongod是MongoDB的服务端进程,mongo是客户端,其他命令用于别的用途,如MongoDB文件导出等
建立软链接,这样可以方便执行
1
2
|
sudo
ln
-s
/usr/local/mongodb/bin/mongod
/usr/local/bin/mongod
sudo
ln
-s
/usr/local/mongodb/bin/mongo
/usr/local/bin/mongo
|
1.3.2 data目录
如果没有data目录,新建data目录
1
|
mkdir
data
|
1.4 启动mongoDB
无密启动
1
|
mongod --dbpath=
/usr/local/mongodb/data/
--logpath=
/usr/local/mongodb/data/mongodb
.log --logappend&
|
有密启动
mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/data/mongodb.log --auth --logappend&
启动后,默认端口是27017,检测下
1.5 启动客户端
无需认证
1
2
3
|
$
sudo
mongo
MongoDB shell version: 3.2.0
connecting to:
test
|
需认证
sudo mongo -u user -p pwd ip:port/db_log
由于它是一个JavaSc shell,可以运行一些简单的算术计算
> 3*8 24 > 34+(3+4) 41 > 4/12 0.3333333333333333
1.6 关闭mongod
墙裂推荐
进入mongo shell
use admin
db.shutdownServer()
或者
sudo killall mongod
坚决反对 kill -9 mongod
2. 设置密码
注:V3版本mongoDB已经不再使用addUser,而是采用了db.createUser.
在无密条件下设置密码:
给库test_mongo_auth添加用户、密码
use test_mongo_auth
db.createUser( { user: "userabc", pwd: "123456", roles: [ "readWrite", "dbAdmin" ] } )
在有密条件下启动,就会提示有密码
3. Robomongo
可视化MongoDB管理工具(软件)。
注:MongoDB添加密码后,Robomongo0.9与MongoDBV3匹配。
4. RockMongo
RockMongo是PHP写的MongoDB Web管理工具。
安装PHP的Mongo扩展
方式一:pecl安装
sudo /usr/local/php/bin/pecl install mongodb
方式二:源码安装
现在php的MongoDB扩展(链接)
解压、进入源码目录
sudo /usr/local/php/bin/phpize sudo ./configure --with-php-config=/usr/local/php/bin/php-config sudo make sudo make install
配置/usr/local/php/lib/php.ini,添加
extension=mongo.so
下载RockMongo,解压后放到httpd的web站点目录(默认是:/usr/local/apache2/htdocs)
修改配置文件(/usr/local/httpd/htdocs/rockmongo/config.php),修改host&post
$MONGO["servers"][$i]["mongo_host"] = "100.18.170.35";//mongo host $MONGO["servers"][$i]["mongo_port"] = "27017";//mongo port
重启web服务
sudo apachectl restart
登录web操作界面
http://106.11.33.207/rockmongo/index.php
用户名:密码(默认):admin:admin
5. 高频操作
漂亮显示: db.person.find.pretty()
删除符合条件的数据项:db.person.remove({age:22})
时间大于一时间点的所有记录
db.tasks.find({'time':{"$gt":new Date("2016/02/15 00:00:00")}}).count()
与、或操作
db.XXX.find({"$or":[{"name":"BuleRiver"}, {"name":"BuleRiver2"}]})
时间+与操作
db.tasks.find({"$and":[{time:{"$gt":new Date("2016/02/15 11:55:00")}},{message:/task_id/}]})
定时删除
db.test_col.createIndex( { "time": 1 }, { expireAfterSeconds: 518400 }
6. 非正常关闭后修复
mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/data/mongodb.log --repair
7. 操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
|
show dbs:显示数据库列表
show collections:显示当前数据库中的集合(类似关系数据库中的表)
show
users
:显示用户
use <db name>:切换当前数据库,这和MS-SQL里面的意思一样
db.help():显示数据库操作命令,里面有很多的命令
db.foo.help():显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令
db.foo.
find
():对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据)
db.foo.
find
( {
"a"
:
"abc"
} ):对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为abc
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});
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.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();
聚集集合查询
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/
});
//
相当于%%
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
({***: {$exists:
true
}}).count();
相当于:
select
count(***) 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();
修改、添加、删除集合数据(以下以collection
users
为例)
1、添加/插入
db.
users
.save({name: ‘zhangsan', age: 25, ***:
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, ***: i % 2});
... };
这样就循环添加了30条数据,同样也可以省略括号的写法
>
for
(var i = 0; i < 30; i++) db.
users
.save({name:
"u_"
+ i, age: 22 + i, ***: 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));}); <br><br><br>删除collection col的所有记录:db.col.remove({})<br>删除collection的col表:db.col.drop()<br><br><br>
|