• mongodb2


    $exists

    判断一个域是否存在

    查找存在hobby域的文档

    > db.class1.find({hobby:{$exists:true}},{_id:0})
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "赵四", "age" : 56, "hobby" : [ "吃饭", "睡觉", "看戏" ] }
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }
    >

    查找不存在hobby域的文档

    > db.class1.find({hobby:{$exists:false}},{_id:0})
    { "name" : "lily", "age" : 17 }
    >

    $mod

    做除数余数查找

    查找,age能被2除,余数为1 的文档

    > db.class1.find({age:{$mod:[2,1]}},{_id:0})
    { "name" : "lily", "age" : 17 }
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }
    >

    ¥type

    查找指定数据类型的文档

    TypeNumberAliasNotes
    Double 1 “double”  
    String 2 “string”  
    Object 3 “object”  
    Array 4 “array”  
    Binary data 5 “binData”  
    Undefined 6 “undefined” Deprecated.
    ObjectId 7 “objectId”  
    Boolean 8 “bool”  
    Date 9 “date”  
    Null 10 “null”  
    Regular Expression 11 “regex”  
    DBPointer 12 “dbPointer” Deprecated.
    JavaScript 13 “javascript”  
    Symbol 14 “symbol” Deprecated.
    JavaScript (with scope) 15 “javascriptWithScope”  
    32-bit integer 16 “int”  
    Timestamp 17 “timestamp”  
    64-bit integer 18 “long”  
    Decimal128 19 “decimal” New in version 3.4.
    Min key -1 “minKey”  
    Max key 127 “maxKey”

    > db.class1.find({hobby:{$type:2}},{_id:0})
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "赵四", "age" : 56, "hobby" : [ "吃饭", "睡觉", "看戏" ] }
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }
    >https://docs.mongodb.com/manual/reference/operator/query/type/index.html

    进一步的信息筛选

    distinct()

    功能:查看一个集合中某个域值的覆盖范围(去除相同项)

    > db.class1.distinct('age')
    [ 17, 35, 56, 55 ]

    > db.class1.distinct('hobby')
    [ "吃饭", "打豆豆", "睡觉", "看戏", "喝酒", "打飞机", "二人转" ]
    >

    pretty()

    功能:查询结果,格式化显示

    > db.class1.find().pretty()
    {
    "_id" : ObjectId("5d2d651f054ccfda64df9a35"),
    "name" : "lily",
    "age" : 17
    }
    {
    "_id" : ObjectId("5d2ed0c9226651eee5c79df3"),
    "name" : "刘英",
    "age" : 35,
    "hobby" : [
    "吃饭",
    "睡觉",
    "打豆豆"
    ]
    }

    limit()

    功能:查询结果显示前n条

    > db.class1.find({},{_id:0}).limit()
    { "name" : "lily", "age" : 17 }
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "赵四", "age" : 56, "hobby" : [ "吃饭", "睡觉", "看戏" ] }
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }
    > db.class1.find({},{_id:0}).limit(3)
    { "name" : "lily", "age" : 17 }
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "赵四", "age" : 56, "hobby" : [ "吃饭", "睡觉", "看戏" ] }
    >


    skip(n)

    功能:显示时跳过前N条

    > db.class1.find({},{_id:0}).skip(0)
    { "name" : "lily", "age" : 17 }
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "赵四", "age" : 56, "hobby" : [ "吃饭", "睡觉", "看戏" ] }
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }
    > db.class1.find({},{_id:0}).skip(3)
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }
    >

    count()

    功能:对查找结果计数统计

    > db.class1.find({},{_id:0}).count()
    5
    > db.class1.find({age:55},{_id:0}).count()
    2
    >

    sort({键:1/-1})

    功能:对查找结果排序

    1表示按照升序排列,-1表示按照降序排列

    > db.class1.find({age:{$exists:true}},{_id:0}).sort({age:1})-----升序排
    { "name" : "lily", "age" : 17 }
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }
    { "name" : "赵四", "age" : 56, "hobby" : [ "吃饭", "睡觉", "看戏" ] }
    > db.class1.find({age:{$exists:true}},{_id:0}).sort({age:-1})------------降序排列
    { "name" : "赵四", "age" : 56, "hobby" : [ "吃饭", "睡觉", "看戏" ] }
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "lily", "age" : 17 }
    >

    复合排序:当age出现相同时,按照name的降序排序

    > db.class1.find({age:{$exists:true}},{_id:0}).sort({age:-1,name:-1})
    { "name" : "赵四", "age" : 56, "hobby" : [ "吃饭", "睡觉", "看戏" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "lily", "age" : 17 }
    >

    函数的连续使用

    查找年龄最小的三个

    > db.class1.find({},{_id:0}).sort({age:1}).limit(3)
    { "name" : "lily", "age" : 17 }
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    >

    删除文档:

    db.collectionName.remove(query,justOne)

    功能;删除指定的文档

    参数;query;筛选要删除的文档,类似where子句

          用法同查找操作

        justOne:布尔值,默认 false 表示删除所有筛选数据

            如果赋值为true,则表示只删除第一条复合的文档

    删除没有hobby或age大于55的文档

    > db.class1.remove({$or:[{hobby:{$exists:false}},{age:{$gt:55}}]})
    WriteResult({ "nRemoved" : 2 })
    > db.class1.find({},{_id:0})
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "刘能", "age" : 55, "hobby" : [ "喝酒", "打飞机", "看戏" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }

    >

    删除age等于55 的第一条语句,

    > db.class1.remove({age:{$eq:55}},true)-------由于true参数的存在,只删除了第一条语句,否则会                                                                               删除两条age等于55的语句

    WriteResult({ "nRemoved" : 1 })
    > db.class1.find({},{_id:0})
    { "name" : "刘英", "age" : 35, "hobby" : [ "吃饭", "睡觉", "打豆豆" ] }
    { "name" : "广坤", "age" : 55, "hobby" : [ "二人转", "喝酒" ] }
    >

    删除集合中所有的文档

    db.collectionName.remove({})注意要有{}

    > db.class0.remove({})
    WriteResult({ "nRemoved" : 11 })
    >

    hobby中即什么又什么可以用$all

    > db.class1.find({hobby:{$all:["打飞机","睡觉"]}},{_id:0})
    { "name" : "玉田", "age" : 28, "hobby" : [ "打飞机", "睡觉", "吃饭" ] }
    >

    修改数据:

    db.collectionName.update(query,update,upsert,multi)

    功能:修改一个文档

    参数:query:筛选要修改的文档,相当于where子句

          用法同查找

        update:将数据更新成什么内容,相当于set操作

            需要使用修改器操作符

        upsert:bool值,默认为false 表示如果query的文档不存在,则无法修改

           如果设置为true,表示如果query的文档不存在,则根据query和update参数插入新                            的文档

        multi:bool值,默认为false.表示如果有多条符合筛选条件的文档,则只修改第一条

           如果设置true,则修改所有符合条件的文档

    设置刘英的年龄为31:

    > db.class1.update({name:'刘英'},{$set:{age:31}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

    update可以插入一条新的文档,注意要有true,否则不会

    > db.class1.update({name:'小刘英'},{$set:{age:11}},true)
    WriteResult({
    "nMatched" : 0,
    "nUpserted" : 1,
    "nModified" : 0,
    "_id" : ObjectId("5d301d939646724b48d62ae5")
    })

    修改器操作符:

    1、$set

    修改一个域的值;

    还可以增加一个域

    小刘英开始没有hobby域

    > db.class1.update({name:'小刘英'},{$set:{hobby:['看书','学习']}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

    $unset

    删除一个域

    删除玉田的age域,age:0是语法需要,习惯是写0,其他数字也可以

    > db.class1.update({name:'玉田'},{$unset:{age:0}})

    $rename

    修改一个域的名称

    把"age"修改成‘’Age‘’

    > db.class1.update({},{$rename:{age:'Age'}},false,true)

    $setOnInsert

    如果update操作插入新的文档,则补充插入内容

    刘能在之前的没有

    > db.class1.update({name:'刘能'},{$set:{hobby:['喝酒','吹牛']},$setOnInsert:{Age:60,telephone:138}},true)

    $inc

    加减修改器

    年龄-2

    > db.class1.update({Age:{$gt:55}},{$inc:{Age:-1}},false,true)

    $mul 

    乘法修改器

    可以乘以正数、负数、小数

    小刘英年龄乘以2

    > db.class1.update({name:'小刘英'},{$mul:{age:2}})

    $min

    设定最小值:如果筛选的文档指定的域值小于min值,则不修改;

          如果大于min值,则改为min值,

    刘能的年龄是59,大于min(55),所以最后只有他的年龄改成了55

    > db.class1.update({},{$min:{Age:55}},false,true)

    $max

    设置最大值:如果筛选的文档的值域大于max,则不修改;

           如果小于max值,则改为max值

    > db.class1.update({},{$max:{Age:24}},false,true)

    数组修改器

    $push增加

    > db.class1.update({name:'刘能'},{$push:{hobby:'打麻将'}})

    $pushAll

    添加多项

     $each 逐个操作

    > db.class1.update({name:'广坤'},{$push:{hobby:{$each:['抽烟','烫头']}}})

    position:

    选择数据位置进行操作,必须和each合用

    > db.class1.update({name:'谢大脚'},{$push:{hobby:{$each:['跳舞','唱歌'],$position:1}}})

    $sort:

    对数组进行排序,必须和each合用

    each[]表示没有插入,只排序  1表示升序;-1表示降序

    > db.class1.update({name:'谢大脚'},{$push:{hobby:{$each:[],$sort:-1}}})

    $pull

    从数组中删除一个元素

    > db.class1.update({name:'广坤'},{$pull:{hobby:'二人转'}})

    $pullAll

    从数组中删除多个元素

    db.class1.update({name:'广坤'},{$pullAll:{hobby:['喝酒','烫头']}})

    $pop

    弹出(删除)数组中的一项(第一项或者最后一项)1表示最后一项;-1表第一项

    > db.class1.update({name:'玉田'},{$pop:{hobby:1}})

    $addToSet

    向数组中插入一个元素,但是该元素不能和其他元素重复

    如果之前没有烫头,插入烫头;如果之前有,不会在插入

    但是push,就可以插入烫头,即使之前有烫头,就会变成两个烫头

    > db.class1.update({name:'广坤'},{$addToSet:{hobby:'烫头'}})

    数据类型:

    时间类型 mongo中存储时间的格式:ISODate(当前时间)

    > db.class0.insert({day:new Date()})
    WriteResult({ "nInserted" : 1 })
    > db.class0.find({},{_id:0})
    { "day" : ISODate("2019-07-19T03:16:52.187Z") }
    >

    > db.class0.insert({day:Date()})
    WriteResult({ "nInserted" : 1 })
    > db.class0.find({},{_id:0})
    { "day" : ISODate("2019-07-19T03:16:52.187Z") }
    { "day" : ISODate("2019-07-19T04:19:25.349Z") }
    { "day" : "Fri Jul 19 2019 12:22:02 GMT+0800 (CST)" }
    >

    指定时间的转换:

    ISODate()

    功能:生成mongo时间类型

    参数:如果不加参数,怎生成当前时间

        参数格式:‘’2019-10-10 10:10:10"

              20191001 10:10:10

              "20190102"

    > db.class0.insert({title:'python',day:ISODate('20190101 11:09:07')})

    时间戳获取:

    1970-01-01 00:00:00到现在的秒数

    > db.class0.insert({title:'python',day:ISODate().valueOf()})

    { "title" : "python", "day" : 1563514740935 }

    null:

    1、如果某个域存在,却没有值,可以设置为null;

    > db.class1.insert({name:"大老乃",hobby:null})

    2、表示某个域不存在,可以通过null进行匹配

    > db.class1.find({Age:null},{_id:0})
    { "name" : "大老乃", "hobby" : null }

    object类型(值是一个文档)

    当使用外层文档引用内部文档的时候,可以使用“.”的方法引用

    注意使用时需要加上引号

    > db.class1.insert({name:'王天来',faimly:{father:'王大拿',mother:'谢大脚'}})
    WriteResult({ "nInserted" : 1 })
    > db.class1.find({'faimly.father':'王大拿'},{_id:0})
    { "name" : "王天来", "faimly" : { "father" : "王大拿", "mother" : "谢大脚" } }
    >

    修改

    > db.class1.update({name:'王天来'},{$set:{'faimly.father':'刘能'}})

    数组的下标引用

    使用一个数组时,可以使用‘.’序列下标的方式,使用数组具体的某一项

    同样需要引号

    > db.class1.update({name:'玉田'},{$set:{'hobby.0':'打豆豆'}})

    文档查找结果的有序性

    可以通过[]取查找结果序列的某一项

    > db.class1.find({},{_id:0})[1]

    索引:

    是建立指定键值及所在文档中存储位置的对照清单。使用索引可以方便我们进行快速查找,减少遍历次数,提高查找效率。

    mongo中如何创建索引

    ensureIndex()

    功能:创建索引

    参数:索引类别,索引选项 

    1表示为该域创建正向索引;

    -1表示逆向索引

    _id域会自动创建索引

    > db.class1.ensureIndex({name:1})

    查看索引

    > db.class1.getIndexes()
    [
    {
    "v" : 2,
    "key" : {
    "_id" : 1
    },
    "name" : "_id_",
    "ns" : "stu.class1"
    },
    {
    "v" : 2,
    "key" : {
    "name" : 1
    },
    "name" : "name_1",
    "ns" : "stu.class1"
    }
    ]


    删除索引

    通过索引名称或者索引键值对删除索引

    > db.class1.dropIndex('name_1')

    或db.class1.dropIndex({name:1})

    dropIndexes()

    功能:删除一个集合中的所有索引

    db.class1.dropIndexes()

    索引类型:

    复合索引:根据多个域创建一个索引

    当查询时,经常需要2个域条件时,才能查找结果,使用复合索引,效率会比单独2个域索引,效率要高。

    > db.class1.ensureIndex({name:1,Age:-1})

    > db.class1.getIndexes()
    [
    {
    "v" : 2,
    "key" : {
    "_id" : 1
    },
    "name" : "_id_",
    "ns" : "stu.class1"
    },
    {
    "v" : 2,
    "key" : {
    "name" : 1,
    "Age" : -1
    },
    "name" : "name_1_Age_-1",
    "ns" : "stu.class1"
    }
    ]
    >

    数组索引:

    如果 对某个数组域创建索引,那么表示对数组中的每个值均创建了索引,这时候通过数组中单个值查询,也是索引查询

    子文档索引:

    1、如果对一个域创建索引,此时值是一个文档,则改文档也会创建索引,对子文档中的域进行查找时,也会提高效率

    db.class1.ensureIndex({faimly:1})

    2、如果对一个域中子文档的域创建索引,索引只是针对子文档的域有效果

    db.class1.ensureIndex{‘’faimly.father”:1}

    例如

    { "name" : "王天来", "faimly" : { "father" : "刘能", "mother" : "谢大脚}

    覆盖索引

    查找时只获取索引项的内容,二不必去获取原数据中的其他内容,这样就不去连接原有的数据,直接返回即可。

    name为索引项,显示也只显示name域

    > db.class1.find({name:'玉田'},{_id:0,name:1})
    { "name" : "玉田" }
    >

    唯一索引

    创建索引时,希望索引域的值均不相同,也可以据此限制一个域的值;

    当对某域创建了唯一索引后,不允许再插入相同的值的文档。

    > db.class1.ensureIndex({name:1},{unique:true})

    稀疏索引(间隙索引):

    只针对有指定域的文档创建索引表,没有改域的文档,不会插入到索引表中

    > db.class1.ensureIndex({Age:1},{sparse:true})

    索引约束:

    1、影响数据的插入、删除、修改操作。当数据发生改变时,索引表必须同步更新

    2、索引也需要占用一定的空间资源

    ====================================================

    *1、当数据库大量的操作是插入、修改、删除操作,而非查询操作,不适合创建索引;

    2、当数据量比较小时,考虑空间成本,也不适合创建索引

    3、即使创建索引,也并不是索引越多越好。

  • 相关阅读:
    Ackerman 函数奇怪的函数
    HDU2871 Memory Control 线段树区间合并
    HDU3667 Hotel 线段树 经典空间合并
    图论
    HDU3016 Man Down 线段树
    HDU1878 欧拉回路 判定是否存在欧拉回路
    从今开始
    如何打开注册表编辑器
    ASP.NET中TextBox控件设置ReadOnly="true"后台取不到值
    学习笔记(2011年5月到9月)
  • 原文地址:https://www.cnblogs.com/sike8/p/11205464.html
Copyright © 2020-2023  润新知