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、即使创建索引,也并不是索引越多越好。

 

posted @ 2019-07-19 17:04  sike8  阅读(113)  评论(0编辑  收藏  举报