zoukankan      html  css  js  c++  java
  • mongodb详解

    一.Nosql数据库的优缺点

    优点:

    简单的扩展

    快速的读写

    灵活的数据模型

    缺点:

    不提供对sql的支持

    支持的特性不够丰富

    产品不够成熟

    二.mongodb的特性:面向文档存储的数据库,文档结构为bson

    高性能,易部署,易使用,存储方便(BSON格式:二进制的json),高性能二进制存储(包括视频)

    三.增删改查

    mongodb结构:数据库,集合(表),json(数据),默认id自增(‘_id’)

    更新:

    db.collection.update('查询条件','更新内容','upsert','multi')
    upsert:如果记录存在则更新他,否则插入一条记录(1,0)
    multi:如果有多条符合记录,全部更新(1,0)

    例:
    db.c5.update({name:"user1"},{$set:{name:"cyh"}},0,1) --更新name为user1的值改为cyh
    db.c5.update({name:"user1"},{$set:{age:"10"}},0,1) --增加user1的age属性

    插入:

    insert:db.c1.insert({'_id':1,name:'cyh'});

    save: db.c1.save({'_id:1,name:'ss''});

    区别:默认id自增,但是如果插入id相同则insert会报错(主键冲突),save则会做更新操作。

    删除:

    db.c1.remove();                          --删除所有

    db.c1.remove({name:'user1'})    --删除user1的数据

    查找:

    db.c1.find()                                            --查找所有

    db.c1.find({name:'user1'})                     --查找user1的数据

    db.c1.find({age:24},{age:1})                  --只返回c1表中age这一列(find中的第二个参数就是为了指明返回哪一列,为1代表返回某一列。不指定默认返回所有*)

    db.c1.find({age:24},{age:1,_id:0})         --只返回c1表中age这一列(find中的第二个参数就是为了指明返回哪一列,为0代表不返回某一列)

    条件表达式查找:

    db.c1.find ( {' age ' : { $gt :5 } } )           -- 年龄大于5的数据:{$gt : value}

    db.c1.find( {'age' : { $lt : 5} } )               -- 年龄小于5的数据 :{$lt : value}

    db.c1.find( { 'age':{$gte: 5} } )       -- 年龄大于等于5 $gte

    db.c1.find( { 'age':{$lte: 5} } )        -- 年龄小于等于5 $gte

    db.c1.find( { 'age' : { $ne: 5 } } )           -- 年龄不等于5 $ne(not equal)

    查找数据数量:

    db.c1.count() = db.c1.find().count()

    db.c1.sort({age:1}).skip(2).limit(3).count(1)          --count(1)才能正常的过滤前面的参数,默认为0、

    排序:

    db.c1.sort({age:1});                             -- age进行升序

    db.c1.sort({age:-1});                            -- age进行降序

    限制:

    db.c1.limit(4)                                       -- 从0开始查找四个

    db.c1.skip(1).limit(4)                           -- 跳过第一个往后找四个

    db.c1.sort({age:1}).skip(2).limit(3)      -- 有排序先排序再找结果集,不然数据可能有误差 

    数组包含:$all  ,类似php 的in_array

    db.c1.find({post_arr:{$all:[1,2,3]}})      -- 判断post数组中是否包含123

    字段是否存在:$exists

    db.c1.find({name:{$exists:1}})           -- 判断这个字段是否存在

    取余: $mod

    db.c1.find({age:{$mod:[2,1]}})           -- 查询年龄除2余1的

    类似mysql的in和not in: $in ,$nin

    db.c1.find({'age':{$in:[1,3,5]}})              -- 查询年龄等于1 3 5 的年龄数据

    db.c1.find({'age' :{$nin:[1,3,5]}})           -- 查询年龄不等于1 3 5 的年龄数据

    或连接:$or,$nor

    db.c1.find({$or:{name:'user1',age:'30',sex:'man'}})                -- 查找名字为user1或年龄为30或性别为男的数据

    db.c1.find({$nor:{name:'user1',age:'30',sex:'man'}})             -- 不查找名字为user1或年龄为30或性别为男的数据

    正则表达式:

    db.c1.find({name:/user/i})                                                      -- 查找名称包含user的

    类似mysql中的distinct:

    db.c1.distinct('name');

    匹配数组中的数组元素 : $elemMatch         x.a, x.b

    查找null:

    db.c1.find({'name':{$exsts:1,$in:[null]}});                    -- 查找值为null的就得先去校验是否存在

    db.c1.find('name':{$type:10})                                     -- type = 10代表 null

    查询前后多少条:slice

    db.post.find({},{comment:{$slice:5}})                                -- 查找前5评论

    db.post.find({},{comment:{$slice:-5}})                               -- 查找后5条评论

    db.post.find({},{comment:[20,10]})                                    -- skip 20,limit 10

    db.post.find({},{comment:[-20,10]})                                    --20 from end,limit 10

    魔术方法:

    $set:{$set:{field: value}}
    当field不存在则新增一个,如果存在则更新

    $inc:{sinc:{filed:value}
    把filed的值增加一个value,一般用于递增或递减

    $unset:{$unset:{field:1}}
    删除给定的field 1代表删除

    例:
    db.user.update({_id:1},{$unset:{name:1}}) --删除id为1 的name属性


    $push:{filed:value} 亚单个值或单个数组
    如果field是一个存在的数组,则把value push进去
    如果不存在,则新增一个k-v
    如果存在但不是一个数组,则会报错

    例:
    db.c5.insert({name:"user1",arr:[1,2,3]})
    db.c5.update({name:"user1",{$push:{arr:4}}}) -- 插入4


    $pushAll:{field:value_arr}
    功能和push一样,但是这里可以压入多个值


    $addToSet:{filed:value} 也是压入值到数组的操作(与push不同的是他可以去重,重复压入不生效)
    如果filed存在,并且value不存在,则把value加到数组中
    如果field不存在,那么value当成一个新数组给field
    如果filed是一个已经存在的非数组类型,则会报错

    例:
    db.c5.update({name:"user1"},{$addToSet:{arr:{$each:[7,8,9]}}}) --一次性压入多个值用$each

    $pop:{$pop:{filed:1}} 默认删除数组中的最后一个(-1为删除数组的第一个元素)
    例:
    db.c5.update({name:"user1"},{$pop:{arr:1}})


    $pull:{$pull:{filed:value}}
    如果filed是一个数组,则删除符合value检索的记录
    如果field非数组,则报错
    db.c5.update({name:"user1"},{$push:{arr:5}}); --删除单个value为5的
    db.c5.update({name:"user1"},{$pushAll:{arr:[2,4]}}); --删除多个value对应的记录


    $rename:{$rename:{old_filed_name:new_filed_name}}
    改变键的值
    db.c5.update({name:'user1',{$rename:{arr:post}}}) --将arr改为post

  • 相关阅读:
    STL 全排列
    Happy Programming Contest
    输入外挂
    Crazy Professor
    订票助手 12306
    我的e证空间 出入境证照可在家自拍啦!
    雨生红球藻 虾青素 寻找正规产品!
    CAR 汽车团购网站—广州
    3G路由器、无线接入点(无线AP)、无线路由器!
    微软 Lightswitch 发布 V2 Beta,引入新的逻辑层基础技术!
  • 原文地址:https://www.cnblogs.com/-cyh/p/10099697.html
Copyright © 2011-2022 走看看