MongoDB:MongoDB数据库操作

本文介绍了MongoDB的基本操作,包括插入、查询、更新和删除记录的方法,并提供了详细的示例代码。此外,还介绍了如何利用存储过程及命令行进行数据管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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参数,即可以将一些登录信息屏蔽掉,这样可以让结果更清晰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值