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

  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/-cyh/p/10099697.html
Copyright © 2011-2022 走看看