MongoDB的一些数据库操作
-
一些简单插入记录操作
obj1 = {name:"mongo"}; obj2 = {x :3}; db.things.save(obj1); db.things.save(obj2); db.things.find();
{ "_id" : ObjectId("537ac76797239e18c106d3c4"), "name" : "mongo" } { "_id" : ObjectId("537ac76797239e18c106d3c5"), "x" : 3 } 总结: 1)不需要预先创建一个集合,会在第一次数据插入时自动创建 2)文档中可以存取任何结构的数据 3)每插入一条数据,都会对应一个_id,如果这个_id没有定义,系统会默认生成,类型为ObjectId,也可以设置成其他类型 4)同一个集合中,_id必须唯一,否则,插入重复值,会抛出异常
-
支持js插入记录操作
for(var i = 0;i<10;i++){ db.things.save({x:i,name:"test"+i}); } db.things.find()
{ "_id" : ObjectId("537ac76797239e18c106d3c4"), "name" : "mongo" } { "_id" : ObjectId("537ac76797239e18c106d3c5"), "x" : 3 } { "_id" : ObjectId("537ac8eb97239e18c106d3c6"), "x" : 0, "name" : "test0" } { "_id" : ObjectId("537ac8eb97239e18c106d3c7"), "x" : 1, "name" : "test1" } { "_id" : ObjectId("537ac8eb97239e18c106d3c8"), "x" : 2, "name" : "test2" } { "_id" : ObjectId("537ac8eb97239e18c106d3c9"), "x" : 3, "name" : "test3" } { "_id" : ObjectId("537ac8eb97239e18c106d3ca"), "x" : 4, "name" : "test4" } { "_id" : ObjectId("537ac8eb97239e18c106d3cb"), "x" : 5, "name" : "test5" } { "_id" : ObjectId("537ac8eb97239e18c106d3cc"), "x" : 6, "name" : "test6" } { "_id" : ObjectId("537ac8eb97239e18c106d3cd"), "x" : 7, "name" : "test7" } { "_id" : ObjectId("537ac8eb97239e18c106d3ce"), "x" : 8, "name" : "test8" } { "_id" : ObjectId("537ac8eb97239e18c106d3cf"), "x" : 9, "name" : "test9" }
-
查询记录
1) 游标
var cursor = db.things.find(); while (cursor.hasNext()) printjson(cursor.next()); <==> db.things.find().forEach(printjson);
注:在使用游标时,会占用内存,当游标对象很大时,内存可能会溢出,这时,可能出现操作还未执行完,游标已经释放。 解决方法: a.迭代方式输出 b.把游标转化成数组 var arr = db.things.find().toArray(); arr[5];
2) 条件查询
db.things.find({where条件},{显示字段}); 如:db.things.find({name:"mongo"})
3) find和findOne的区别
a. findOne是返回一个object。 ---> x = db.things.findOne(); b. find是返回一个cursor,要用next() 才能取出真正的数据 cur = db.things.find().limit(1) x = cur.next()
4) 查询的几个限制limit ,skip,sort
db.things.find().limit(3) db.things.find().skip(2) //表示跳过前往2个,再查询所有。 db.things.find().sort({x:1,name:-1}) //安装x的升序,name的降序排列查询结果。1表升序,-1表降序。
注:skip( )略过多的结果,可能导致问题,少量的可以,当大量的文档时候,容易紊乱出错。
5) Javascript查询和$where查询
查询a大于3的数据,下面的查询方法殊途同归db.things.find( { x : { $gt: 3 } } ); db.things.find( { $where: "this.x > 3" } ); db.things.find("this.x > 3"); f = function() { return this.x > 3; } db.things.find(f);
6) 条件操作符
a.<, <=, >, >=,<> $lt,$lte,$gt,$gte,$ne db.things.find({ "x" : { $gt: 3, $lt: 7} } ); // 3< x< 7 b.$all匹配所有 $all必须满足[ ]内的所有值,例如: db.users.find({age : {$all : [6, 8]}}); 可以查询出 {name: 'David', age: 26, age: [ 6, 8, 9 ] } 但查询不出 {name: 'David', age: 26, age: [ 6, 7, 9 ] } c.$exists判断字段是否存在 查询所有存在age字段的记录 db.users.find({age: {$exists: true}}); 查询所有不存在name字段的记录 db.users.find({name: {$exists: false}}); d.Null值处理 db.user.find({age:{"$in":[null], "$exists":true}}) e.$mod取模运算 查询age取模10等于0的数据 db.user.find( { age: { $mod : [ 10 , 1 ] } } ) f.$in包含 $nin不包含 要查询的是一系列枚举值的范围内 如查询x的值在2,4,6范围内的数据 db.things.find({x:{$in: [2,4,6]}}); g.$size数组元素个数 对于{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }记录 匹配 db.users.find({favorite_number: {$size: 3}}); 不匹配 db.users.find({favorite_number: {$size: 2}}); h.正则表达式匹配 查询不匹配name=B*带头的记录 db.users.find({name: {$not: /^B.*/}}); i.count查询记录条数 count查询记录条数 db.users.find().count(); 以下返回的不是5,而是user表中所有的记录数量 db.users.find().skip(10).limit(5).count(); 如果要返回限制之后的记录数量,要使用count(true)或者count(非0) db.users.find().skip(10).limit(5).count(true);
-
Mongodb数据更新命令
1) update命令
update命令格式:db.collection.update(criteria,objNew,upsert,multi) 参数说明: criteria:查询条件 objNew:update对象和一些更新操作符 upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。 multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。
2) save命令
save格式如下:db.collection.save(obj) obj代表需要更新的对象,如果集合内部已经存在一个和obj相同的"_id"的记录,Mongodb会把obj对象替换集合内已存在的记录,如果不存在,则会插入obj对象。
3) 数据更新操作符
a.$inc 用法:{$inc:{field:value}} 作用:对一个数字字段的某个field增加value 示例:对所有name为admin的age增加5 db.user.update({name:"admin"},{$inc:{age:5}}) b.$set 用法:{$set:{field:value}} 作用:把文档中某个字段field的值设为value 示例: 把admin的年龄设为23岁 db.user.update({name:"admin"},{$set:{age:23}}) c.$unset 用法:{$unset:{field:1}} 作用:删除某个字段field 示例: 将admin的年龄字段删除 db.user.update({name:"admin"},{$unset:{age:1}}) d.$push 用法:{$push:{field:value}} 作用:把value追加到field里。注:field只能是数组类型,如果field不存在,会自动插入一个数组类型 示例:给admin添加别名"root" db.user.update({name:"admin"},{$push:{"ailas":"root"}}) e.pushAll 用法:{$pushAll:{field:value_array}} 作用:用法同$push一样,只是$pushAll可以一次追加多个值到一个数组字段内。 示例:给admin追加别名A1,A2 db.user.update({name:"admin"},{$pushAll:{"ailas":["A1","A2"]}}) f.$addToSet 用法:{$addToSet:{field:value}} 作用:加一个值到数组内,而且只有当这个值在数组中不存在时才增加。 示例:往admin的别名字段里添加两个别名A3、A4 db.user.update({name:"admin"},{$addToSet:{"ailas":["A3","A4"]}}) g.$pop 用法:删除数组内第一个值:{$pop:{field:-1}}、删除数组内最后一个值:{$pop:{field:1}} 作用:用于删除数组内的一个值 示例: 删除admin记录中alias字段中第一个别名 db.user.update({name:"admin"},{$pop:{"ailas":-1}}) h.$pull 用法:{$pull:{field:_value}} 作用:从数组field内删除一个等于_value的值 示例:删除admin记录中的别名A1 db.user.update({name:"admin"},{$pull:{"ailas":"A1"}}) i.$pullAll 用法:{$pullAll:value_array} 作用:用法同$pull一样,可以一次性删除数组内的多个值。 示例: 删除admin记录内的所有别名 db.user.update({name:"admin"},{$pullAll:{"ailas":["A1","A2"]}}) j.$rename 用法:{$rename:{old_field_name:new_field_name}} 作用:对字段进行重命名 示例:把admin记录的name字段重命名为sname db.user.update({name:"admin"},{$rename:{"name":"sname"}})
-
MongoDB中的删除操作
1) 删除用户:db.removeUser("用户名") 2) 删除数据库:db.dropDataBase() ,删除当前正在使用的数据库。 3) 删除集合:db.集合名.drop(),直接把整个集合删除掉。 4) 删除指定集合内的文档:db.集合名.remove(),remove是用来从数据库中永久删除文档。 如果没有指定参数,它会删除指定结合的所有文档。我们可以给它提供参数,以删除限定的文档。 如:假设要删除blog集合一个title为mongo的文档,执行以下操作:db.blog.remove({title:"mongo"})
-
存储过程
var f = function addNumbers(x,y){ return x + y; } db.system.js.save({_id:"addNumbers", value:f}); db.system.js.find() db.eval('addNumbers(3, 4.2)'); //调用
-
命令行调用执行
1)通过eval参数执行指定语句
查询test库的t1表中的记录数有多少./mongo test --eval "printjson(db.t1.count())"
2)命令行调用执行js
MONGO_HOME=~/mongodb host=127.0.0.1 port=27017 db=test username=user password=pwd cd ~/mongodb/js $MONGO_HOME/bin/mongo $host:$port/$db -u $username -p $password test.js mongo 127.0.0.1:27017/test -u user -p 123 test.js --shell
注:指定quiet参数,即可以将一些登录信息屏蔽掉,这样可以让结果更清晰