MongDB篇,第三章:数据库知识3
MongDB 数据库知识3
修改器
$inc 对某个域的值进行加减修改
$mul 对某个域的值进行乘法修改
$min 如果筛选的文档指定的值小于min则不修改,如果大于min 给定的值则修改为min值;
$max 如果筛选的文档指定域的值大于max值则不变,小于max值则修改为max值;
> use stu
switched to db stu
> stu.class1.insert(name:'xiaoming',age:21,sex:'m')
2018-07-21T18:01:16.080+0800 E QUERY [js] SyntaxError: missing ) after argument list @(shell):1:22
> stu.class1.insert({name:'xiaoming',age:21,sex:'m'})
2018-07-21T18:01:30.062+0800 E QUERY [js] ReferenceError: stu is not defined :
@(shell):1:1
> use stu
switched to db stu
> stu.class1.insert({name:'xiaoming',age:21,sex:'m'})
2018-07-21T18:01:45.167+0800 E QUERY [js] ReferenceError: stu is not defined :
@(shell):1:1
> db.class1.insert({name:'xiaoming',age:21,sex:'m'})
WriteResult({ "nInserted" : 1 })
>
> db.class1.insert({name:'lili',age:19,sex:'w'})
WriteResult({ "nInserted" : 1 })
> db.class1.insert({name:'tom',age:22,sex:'m'})
WriteResult({ "nInserted" : 1 })
> db.class1.insert({name:'ailee',age:20,sex:'w'})
WriteResult({ "nInserted" : 1 })
> db.class1.find()
{ "_id" : ObjectId("5b5304cdcf01890d9630ce8b"), "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "_id" : ObjectId("5b5304e0cf01890d9630ce8c"), "name" : "lili", "age" : 19, "sex" : "w" }
{ "_id" : ObjectId("5b5304f4cf01890d9630ce8d"), "name" : "tom", "age" : 22, "sex" : "m" }
{ "_id" : ObjectId("5b530524cf01890d9630ce8e"), "name" : "ailee", "age" : 20, "sex" : "w" }
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 22, "sex" : "m" }
{ "name" : "ailee", "age" : 20, "sex" : "w" }
>
>
>
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 22, "sex" : "m" }
{ "name" : "ailee", "age" : 20, "sex" : "w" }
> db.class1.update({name:'tom'},{$inc:{age:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 23, "sex" : "m" }
{ "name" : "ailee", "age" : 20, "sex" : "w" }
> db.class1.update({name:'tom'},{$inc:{age:-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 22, "sex" : "m" }
{ "name" : "ailee", "age" : 20, "sex" : "w" }
> db.class1.update({name:'tom'},{$inc:{age:2}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 20, "sex" : "w" }
> db.class1.update({name:'xiaoming'}{$mul:{age:0.5}})
2018-07-21T18:09:13.646+0800 E QUERY [js] SyntaxError: missing ) after argument list @(shell):1:34
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 20, "sex" : "w" }
> db.class1.update({name:'xiaoming'},{$mul:{age:0.5}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 10.5, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 20, "sex" : "w" }
> db.class1.update({name:'xiaoming'},{$mul:{age:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 10.5, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 20, "sex" : "w" }
> db.class1.update({name:'xiaoming'},{$mul:{age:2}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 20, "sex" : "w" }
> db.class1.update({name:'ailee''},{$min:{age:18}},false,ture)
2018-07-21T18:14:51.951+0800 E QUERY [js] SyntaxError: unterminated string literal @(shell):1:30
> db.class1.update({name:'ailee'},{$min:{age:18}},false,ture)
2018-07-21T18:15:24.550+0800 E QUERY [js] ReferenceError: ture is not defined :
@(shell):1:40
> db.class1.update({name:'ailee'},{$min:{age:18}},false,true)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
> db.class1.update({name:'w'},{$min:{age:19}},false,true)
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
> db.class1.update({name:'w'},{$min:{age:20}},false,true)
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
> db.class1.update({sex:'w'},{$min:{age:19}},false,true)
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 0 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 19, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
> db.class1.update({sex:'w'},{$min:{age:18}},false,true)
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 1 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 18, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
> db.class1.update({name:'lili'},{$max:{age:21}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 21, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
>
修改操作符 $set
修改一个域的值,或者增加一个域 e.g.
db.class1.update({},{$set:{sex:'w'}},false,true) e.g.
db.class1.update({name:'Abby'},{$set:{age:19,sex:'m'}}) $unset
删除一个域 e.g. 删除sex域 (后面数字0或1都表示删除)
db.class1.update({name:'Abby'},{$unset:{sex:0}}) $rename
修改域名 e.g. 将所有的sex域名改为gender
db.class1.update({},{$rename:{sex:'gender'}},false,true) $setOnInsert
如果第三个参数为true 并且插入新的文档,则作为插入补充内容 e.g. 如果插入了新的文档则将setOnInsert中的内容也 插入到文档中
db.class1.update({name:'Jame'},{$set:{age:19},$setOnInsert:{gender:'m','tel':"12345"}},true) * update参数中可以写多个修改器 $inc
加减修改器 e.g. 年龄加1
db.class1.update({name:'Abby'},{$inc:{age:1}})
* 操作数可以是正数负数小数 $mul
乘法修改器 e.g. 将年龄乘以0.5
db.class1.update({name:'Jame'},{$mul:{age:0.5}})
* 操作数可以是正数负数小数 $min
如果筛选的文档指定的值小于min则不修改,如果大于min给定的值则修改为min值 e.g.
db.class1.update({gender:'w'},{$min:{age:19}},false,true) $max
如果筛选的文档指定域的值大于max值则不变,小于max值则修改为max值 e.g.
db.class1.update({name:'Jame'},{$max:{age:20}})
数组修改器
$push 向数组中添加一项;
$pushAll 向数组中添加多项;
$pull 从数组中删除一项;
$pullAll 从数组中删除多项;
$each 对多个值进行逐一操作;
$position 指定插入位置;
$sort 对数组进行排序
$pop 弹出一项,值为-1 表示弹出第一项, 1 表示弹出最后一项;
$addToSet 向数组中添加一项,不能和其他的项重复;(如果原数组中没有5则添加,有则不做修改)
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "match", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "English", "chinese" ] }
> db.class0.update({name:'ailee'},{$push:{learn:'match'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "match", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "English", "chinese", "match" ] }
####
> db.class0.update({name:'tom'},{$push:{learn:{$each:['linux','unix']}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "English", "linux", "unix" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "English", "chinese", "match" ] }
> db.class0.find({},{_id:0,name:1,learn:1})
{ "name" : "xiaoming", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "learn" : [ "English", "linux", "unix" ] }
{ "name" : "ailee", "learn" : [ "English", "chinese", "match" ] }
> db.class0.update({name:'tom'},{$push:{learn:{$each:['shell'],$position:1}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class0.find({},{_id:0,name:1,learn:1})
{ "name" : "xiaoming", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "learn" : [ "English", "shell", "linux", "unix" ] }
{ "name" : "ailee", "learn" : [ "English", "chinese", "match" ] }
> #################
> db.class0.find({},{_id:0,name:1,learn:1})
{ "name" : "xiaoming", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "learn" : [ "English", "shell", "linux", "unix" ] }
{ "name" : "ailee", "learn" : [ "English", "chinese", "match" ] }
> db.class0.update({name:'tom'},{$push:{learn:{$each:[],$sort:1}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class0.find({},{_id:0,name:1,learn:1})
{ "name" : "xiaoming", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "learn" : [ "English", "linux", "shell", "unix" ] }
{ "name" : "ailee", "learn" : [ "English", "chinese", "match" ] }
> db.class0.update({name:'tom'},{$push:{learn:{$each:[],$sort:-1}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.class0.find({},{_id:0,name:1,learn:1})
{ "name" : "xiaoming", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "learn" : [ "unix", "shell", "linux", "English" ] }
{ "name" : "ailee", "learn" : [ "English", "chinese", "match" ] }
> ######
> db.class0.update({name:'ailee'},{$pop:{learn:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" :
> db.class0.find({},{_id:0,name:1,learn:1})
{ "name" : "xiaoming", "learn" : [ "match", "English", "chin
{ "name" : "lili", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "learn" : [ "unix", "shell", "linux", "Eng
{ "name" : "ailee", "learn" : [ "English", "chinese" ] }
> db.class0.find({},{_id:0,name:1,learn:-1})
{ "name" : "xiaoming", "learn" : [ "match", "English", "chin
{ "name" : "lili", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "learn" : [ "unix", "shell", "linux", "Eng
{ "name" : "ailee", "learn" : [ "English", "chinese" ] }
> db.class0.find({},{_id:0,name:1,learn:1})
{ "name" : "xiaoming", "learn" : [ "match", "English", "chin
{ "name" : "lili", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "learn" : [ "unix", "shell", "linux", "Eng
{ "name" : "ailee", "learn" : [ "English", "chinese" ] }
> db.class0.update({name:'ailee'},{$pop:{learn:-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" :
> db.class0.find({},{_id:0,name:1,learn:1})
{ "name" : "xiaoming", "learn" : [ "match", "English", "chin
{ "name" : "lili", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "learn" : [ "unix", "shell", "linux", "Eng
{ "name" : "ailee", "learn" : [ "chinese" ] }
>
数组修改器 $push 向数组中添加一项
e.g.
db.class2.update({name:'小刚'},{$push:{score:10}}) $pushAll 向数组中添加多项
e.g.
db.class2.update({name:'小明'},{$pushAll:{score:[10,5]}}) $pull 从数组中删除一项
e.g.
db.class2.update({name:'小红'},{$pull:{score:''}}) $pullAll 从数组中删除多项
e.g.
db.class2.update({name:'小明'},{$pullAll:{score:[10,5]}}) $each 对多个值进行逐一操作 e.g.
db.class2.update({name:'小明'},{$push:{score:{$each:[10,5]}}}) $position 指定插入位置
e.g. 需要搭配each使用,插入到1号位置
db.class2.update({name:'小红'},
{$push:{score:{$each:[],$position:1}}}) $sort 对数组进行排序 e.g. 和each一起使用,对score数组升序排序
db.class2.update({name:'小明'},
{$push:{score:{$each:[],$sort:1}}}) $pop 弹出一项 e.g. 值为-1表示弹出第一项 1 表示弹出最后一项
db.class2.update({name:'小明'},{$pop:{score:1}}) $addToSet 向数组中添加一项,不能和其他的项重复 e.g. 如果原数组中没有5则添加,有则不做修改
db.class2.update({name:'小明'},{$addToSet:{score:5}})
时间类型
mongo中存储事件格式:ISODate()
方法1: new Date() 自动生成当前时间
db.class0.insert({title:'Python入门',date:new Date()})
方法2: ISODate() 生成当前时间
db.class0.insert({title:'Python精通',date:ISODate()})
方法3: Date() 将生成的当前时间变为字符串
db.class0.insert({title:'Python疯狂',date:Date()})
ISODate()
功能:生成mongo时间存储类型
参数:参数为指定时间
“2018-1-1 12:10:34”
“20180101 12:10:34”
"20181102"
e.g.
db.class0.insert({title:'Python崩溃',date:ISODate("2018-11-12 11:23:32")})
时间戳
valueof()
将当前时间生成为时间戳
e.g.
db.class0.insert({title:'Python放生',date:ISODate().valueOf()})
> db.class0.insert({title:'python',date:new Date()})
WriteResult({ "nInserted" : 1 })
> db.class0.find({},{_id:0,name:1})
{ "name" : "xiaoming" }
{ "name" : "lili" }
{ "name" : "tom" }
{ "name" : "ailee" }
{ }
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "unix", "shell", "linux", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ] }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z") }
>
####
> db.class0.insert({title:'python精通',date:ISODate()})
WriteResult({ "nInserted" : 1 })
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "unix", "shell", "linux", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ] }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z") }
{ "title" : "python精通", "date" : ISODate("2018-07-21T11:56:35.156Z") }
> db.class0.insert({title:'python疯狂',date:Date()})
WriteResult({ "nInserted" : 1 })
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "unix", "shell", "linux", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ] }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z") }
{ "title" : "python精通", "date" : ISODate("2018-07-21T11:56:35.156Z") }
{ "title" : "python疯狂", "date" : "Sat Jul 21 2018 19:58:00 GMT+0800 (CST)" }
> db.class0.insert({title:'python仿生',date:ISODate().valueOf()})
WriteResult({ "nInserted" : 1 })
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "unix", "shell", "linux", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ] }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z") }
{ "title" : "python精通", "date" : ISODate("2018-07-21T11:56:35.156Z") }
{ "title" : "python疯狂", "date" : "Sat Jul 21 2018 19:58:00 GMT+0800 (CST)" }
{ "title" : "python仿生", "date" : 1532174439187 }
>
> db.class0.insert({title:'python',date:new Date()})
WriteResult({ "nInserted" : 1 })
> db.class0.find({},{_id:0,name:1})
{ "name" : "xiaoming" }
{ "name" : "lili" }
{ "name" : "tom" }
{ "name" : "ailee" }
{ }
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "unix", "shell", "linux", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ] }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z") }
>
####
> db.class0.insert({title:'python精通',date:ISODate()})
WriteResult({ "nInserted" : 1 })
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "unix", "shell", "linux", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ] }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z") }
{ "title" : "python精通", "date" : ISODate("2018-07-21T11:56:35.156Z") }
> db.class0.insert({title:'python疯狂',date:Date()})
WriteResult({ "nInserted" : 1 })
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "unix", "shell", "linux", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ] }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z") }
{ "title" : "python精通", "date" : ISODate("2018-07-21T11:56:35.156Z") }
{ "title" : "python疯狂", "date" : "Sat Jul 21 2018 19:58:00 GMT+0800 (CST)" }
> db.class0.insert({title:'python仿生',date:ISODate().valueOf()})
WriteResult({ "nInserted" : 1 })
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "unix", "shell", "linux", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ] }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z") }
{ "title" : "python精通", "date" : ISODate("2018-07-21T11:56:35.156Z") }
{ "title" : "python疯狂", "date" : "Sat Jul 21 2018 19:58:00 GMT+0800 (CST)" }
{ "title" : "python仿生", "date" : 1532174439187 }
>
null
1,如果某个域存在,却没有值,可以设置为null ;
e.g.
db.class0.insert({title:'Python 爬虫',price:null})
2. 某个域不存在,可以使用null来匹配
e.g. 当gender域不存在时可以找到这个文档
db.class1.find({gender:null},{_id:0})
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 21, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
> db.class1.insert({title:'python',price:null})
WriteResult({ "nInserted" : 1 })
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 21, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
{ "title" : "python", "price" : null }
> db.class1.find({hello:null},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 21, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
{ "title" : "python", "price" : null }
>
Object 内部文档
文档内某个域的值还是一个文档则这个文档为内部文档
* 当需要使用内部文档某个域时,可以使用外部文档 . 引用内部文档的方式。但是注意在使用时需要加引号
e.g. db.class3.find({'book2.title':'Css3'},{_id:0})
e.g.
db.class3.update({'book3.title':'JavaScript'},{$set:{'book3.price':38.8}})
数组的下标引用
使用数组时,可以使用数组域 . 数组序列下标的方式使用数组中的具体某一个元素
e.g. 修改数组中的第0项
db.class2.update({name:"小明"},{$set:{'score.0':15}})
e.g. 通过数组中的第0项查找
db.class2.find({'score.0':15},{_id:0})
查找结果的有序性
即可以对find查找结果使用[]引用序列下标的方式获取查找结果的第几项
e.g. db.class2.find({},{_id:0})[3]
> db
stu
> db.book.insert({'python':{'title':'python web','price':50.8,'page':800}})
WriteResult({ "nInserted" : 1 })
> db.book.insert({'java':{'title':'java_test','price':60.5,'page':733}})
WriteResult({ "nInserted" : 1 })
> db.book.find({},{_id:0})
{ "python" : { "title" : "python web", "price" : 50.8, "page" : 800 } }
{ "java" : { "title" : "java_test", "price" : 60.5, "page" : 733 } }
> db.book.find({'python.title':'python web'},{_id:0})
{ "python" : { "title" : "python web", "price" : 50.8, "page" : 800 } }
> db.book.update({'java.title':'java_test'},{$set:{'java.price':55.6}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.book.find({},{_id:0})
{ "python" : { "title" : "python web", "price" : 50.8, "page" : 800 } }
{ "java" : { "title" : "java_test", "price" : 55.6, "page" : 733 } }
>
练习:
1. 将小红年龄修改为8岁,兴趣爱好变为跳舞 画画 :{$set{age:8, hobby:['dance','draw']}}
2. 追加小明的兴趣 爱好 唱歌; {$push:{hobby:['sing']}}
3. 小王兴趣爱好多了 吹牛,打篮球; {$pushAll :{hobby:{'催眠',‘打的’}}}
4. 小李兴趣多了跑步和唱歌,但是要确保不和之前的兴 趣重复; {$addToSet:{hobby:{$each:['running','sing']}}}
5. 该班所有同学年龄加1; update({},{$inc:{age:1}},false,true)
6. 删除小明的sex属性; {$unset:{sex:0}}
7. 删除小李的兴趣中的第一项;{$pop:{hobby:-1}}
8. 删除小红兴趣中画画和唱歌; {$pushAll:{'draw','sing'}}
索引
定义:指建立指定键值及所在文档中存储位置的对照清单。 使用索引可以方便我们快速进行查找,减少遍历次数,提高查找效率;
mongo如何创建索引;
ensureIndex()
功能: 创建索引
参数: 索引域, 提供索引类别, 索引选项;
(1)创建索引: ensureIndex()
例:根据name域创建索引 : db.class2.ensureIndex({'name':1})
注: 1表示正向索引,-1表示逆向索引
(2)查看当前集合索引: db.class2.getIndexes()
注:_id 域是系统自动为集合创建的索引;
(3)创建复合索引(同时根据多个域创建索引)
> db.class3.ensureIndex({name:1,age:1})
(4)删除索引: db.collection_name.dropIndex()
dropIndex()
功能:删除索引
参数:要删除的索引,可以是索引名称或者索引键值对
注:_id 索引是不会删除的
db.class1.dropIndex({name:1})
e.g. db.class1.dropIndex('myIndex')
(5)dropIndexes()
功能:删除所有索引
删除所有索引但是不会删除_id索引
db.class1.dropIndexes()
(6) explain(): 显示详细的查找操作信息;
db.class1.find({name:'aaa'},{_id:0}).explain()
> db.class2.dropIndex({name:1})
{ "nIndexesWas" : 2, "ok" : 1 }
> db.class2.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "stu.class2"
}
]
> db.class2.dropIndex({_id:1})
{
"ok" : 0,
"errmsg" : "cannot drop _id index",
"code" : 72,
"codeName" : "InvalidOptions"
}
> db.class3.drop
db.class3.drop( db.class3.dropIndexes(
db.class3.dropIndex(
> db.class3.dropIndex({name:1,age:1})
{ "nIndexesWas" : 2, "ok" : 1 }
> db.class3.getIndex
db.class3.getIndexKeys( db.class3.getIndexes(
db.class3.getIndexSpecs(
> db.class3.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "stu.class3"
}
]
> db.class3.ensureIndex({name:1,age:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.class3.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "stu.class3"
},
{
"v" : 2,
"key" : {
"name" : 1,
"age" : 1
},
"name" : "name_1_age_1",
"ns" : "stu.class3"
}
]
> db.class3.drop()
db.class3.drop( db.class3.dropIndexes(
db.class3.dropIndex(
> db.class3.dropIndexes()
{
"nIndexesWas" : 2,
"msg" : "non-_id indexes dropped for collection",
"ok" : 1
}
> db.class3.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "stu.class3"
}
]
> db.class
db.class0 db.class1 db.class2 db.class3
> db.class0.find({}.{_id:0})
2018-07-21T21:39:22.724+0800 E QUERY [js] SyntaxError: missing name after . operator @(shell):1:18
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "E nglish", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chine se" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "sun", "shell", "linux", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ] }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z") }
{ "title" : "python精通", "date" : ISODate("2018-07-21T11:56:35.156Z") }
{ "title" : "python疯狂", "date" : "Sat Jul 21 2018 19:58:00 GMT+0800 ( CST)" }
{ "title" : "python仿生", "date" : 1532174439187 }
> db.class0.find({name:'tom'},{_id:0}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "stu.class0",
"indexFilterSet" : false,
"parsedQuery" : {
"name" : {
"$eq" : "tom"
}
},
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {
"_id" : 0
},
"inputStage" : {
"stage" : "COLLSCAN",
"filter" : {
"name" : {
"$eq" : "tom"
}
},
"direction" : "forward"
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "shenzhen.com",
"port" : 27017,
"version" : "4.0.0",
"gitVersion" : "3b07af3d4f471ae89e8186d33bbb1d5259597d5 1"
},
"ok" : 1
}
> db.class0.ensureIndex({name:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.class0.find({name:'tom'},{_id:0}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "stu.class0",
"indexFilterSet" : false,
"parsedQuery" : {
"name" : {
"$eq" : "tom"
}
},
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {
"_id" : 0
},
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"name" : 1
},
"indexName" : "name_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"name" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPa
"inde
"dire
"inde m\"]" }
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "shenzhen.com",
"port" : 27017,
"version" : "4.0.0",
"gitVersion" : "3b07af3d4f471 1"
},
"ok" : 1
}
>
(7)数组索引:
定义: 如果某个域的值为数组文档的的域创建索引,则通过数组文档进行查找时也是索引查找;
db.class1.find({hobby:'run'},{_id:0}).explain()
> db.class0.ensureIndex({learn:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ] }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "ma tch", "chinese" ] }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "sun ", "shell", "linux", "English" ] }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "c hinese" ] }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15 .709Z") }
{ "title" : "python精通", "date" : ISODate("2018-07-21T11:5 6:35.156Z") }
{ "title" : "python疯狂", "date" : "Sat Jul 21 2018 19:58:0 0 GMT+0800 (CST)" }
{ "title" : "python仿生", "date" : 1532174439187 }
> db.class0.find({learn:'sun'},{_id:0}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "stu.class0",
"indexFilterSet" : false,
"parsedQuery" : {
"learn" : {
"$eq" : "sun"
}
},
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {
"_id" : 0
},
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"learn" : 1
},
"indexName" : "lear n_1",
"isMultiKey" : true ,
"multiKeyPaths" : {
"learn" : [
"le arn"
]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false ,
"indexVersion" : 2,
"direction" : "forw ard",
"indexBounds" : {
"learn" : [
"[\ "sun\", \"sun\"]"
]
}
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "shenzhen.com",
"port" : 27017,
"version" : "4.0.0",
"gitVersion" : "3b07af3d4f471ae89e8186d33bb b1d5259597d51"
},
"ok" : 1
}
> db.class0.find({learn:'sun'},{_id:0}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "stu.class0",
"indexFilterSet" : false,
"parsedQuery" : {
"learn" : {
"$eq" : "sun"
}
},
"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {
"_id" : 0
},
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"learn" : 1
},
"indexName" : "learn_1",
"isMultiKey" : true,
"multiKeyPaths" : {
"learn" : [
"learn"
]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"learn" : [
"[\"sun\", \"sun\"]"
]
}
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "shenzhen.com",
"port" : 27017,
"version" : "4.0.0",
"gitVersion" : "3b07af3d4f471ae89e8186d33bbb1d5259597d51"
},
"ok" : 1
}
>
(8)子文档索引:
某个域值为文档,对其子文档创建索引,则加快通过子文档进行查找的查找速度;
db.class1.ensureIndex({'python.price':1})
(9)唯一索引:
定义:创建时,希望创建索引的域有不同的值,也可以通过这个方法来限制域的值;
db.class1.ensureIndex({name:1},{'unique':true})
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 21, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
{ "title" : "python", "price" : null }
> db.class1.dropIndexes()
{
"nIndexesWas" : 1,
"msg" : "non-_id indexes dropped for collection",
"ok" : 1
}
> db.class1.ensureIndex({name:1},{'unique':true})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
>
####
> db.class1.ensureIndex({age:1},{'unique':true})
{
"ok" : 0,
"errmsg" : "E11000 duplicate key error collection: stu.class1 index: age_1 dup key: { : 21.0 }",
"code" : 11000,
"codeName" : "DuplicateKey"
}
>
创建索引时指定域的值不能有重复,创建后插入也不允许插入重复的值;
(10)覆盖索引:(针对查找方式是说明)
定义:查找时,只获取索引项的内容,而不去链接其他文档的内容,这样从索引表就可以得到查找的结果,提高了查询效果;
db.class1.find({name:'tom'},{_id:0,name:1})
(11)稀疏索引(间隙索引)
只针对有指定域的文档创建索引表,如果某个文档没有该域则不会在索引表中插入内容;
db.class0.ensureIndex({age:1},{sparse:true})
注:对没有xx域的文档不做索引处理;
(12)文本索引
使用文本索引可以快速进行文本检索,这在较长的字符串搜索中比较有用;
a,创建文本索引: db.class2.ensureIndex({msg:'text',description:'text'})
b,通过单词进行搜索索引:db.class2.find({$text:{$search:'beautiful'}})
(多个单词用空格隔开,如果有其中任意一个单词就会被搜索)
c, 搜索包含空格的语句,要用转义字符; db.class2.find({$text:{$search:'\'very beautiful\''}},{_id:0})
> db.class2.find({},{_id:0})
{ "name" : "beijing", "msg" : "This is a big city and this is a very old city." }
{ "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
>
> db.class2.find({},{_id:0})
{ "name" : "beijing", "msg" : "This is a big city and this is a very old city." }
{ "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
> db.class2.ensureIndex({msg:'text',description:'text'})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.class2.find({$text:{$search:'beautiful'}})
{ "_id" : ObjectId("5b53473dcf01890d9630ce9b"), "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
> db.class2.find({$text:{$search:'beautiful'}},{_id:0})
{ "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
> db.class2.find({$text:{$search:'This'}},{_id:0})
> db.class2.find({$text:{$search:'This'}})
> db.class2.find({$text:{$search:'The'}})
> db.class2.find({$text:{$search:'old'}})
{ "_id" : ObjectId("5b53473dcf01890d9630ce9b"), "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
{ "_id" : ObjectId("5b534701cf01890d9630ce9a"), "name" : "beijing", "msg" : "This is a big city and this is a very old city." }
> db.class2.find({$text:{$search:'very beautiful'}})
{ "_id" : ObjectId("5b53473dcf01890d9630ce9b"), "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
> db.class2.find({$text:{$search:'old city'}})
{ "_id" : ObjectId("5b53473dcf01890d9630ce9b"), "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
{ "_id" : ObjectId("5b534701cf01890d9630ce9a"), "name" : "beijing", "msg" : "This is a big city and this is a very old city." }
> db.class2.find({$text:{$search:'\'very beautiful\''}},{_id:0})
{ "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
> db.class2.find({$text:{$search:'\'city is\''}},{_id:0})
{ "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
{ "name" : "beijing", "msg" : "This is a big city and this is a very old city." }
>
d, 搜索某个单词,并且不包含某个单词;(减号 -)
> db.class2.find({$text:{$search:'city -big'}},{_id:0})
e, 删除文本索引;
通过getIndexes() ,查看索引名称
通过dropIndex(),删除
> db.class2.find({$text:{$search:'city -big'}},{_id:0})
{ "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
> db.class2.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "stu.class2"
},
{
"v" : 2,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "msg_text_description_text",
"ns" : "stu.class2",
"weights" : {
"description" : 1,
"msg" : 1
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 3
}
]
> db.class2.dropIndex('msg_text_description_text')
{ "nIndexesWas" : 2, "ok" : 1 }
> db.class2.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "stu.class2"
}
]
>
索引约束;
1,当数据库进行大量查找操作时,可以进行索引;而不是修改操作;
影响插入、删除 、修改数据的效率;当数据发生修改时,索引必须同步更新;
2,索引表也需要占用一定空间,所以,当数据量比较小时不适宜创建索引;
总结: 并不是所有情况下都适合创建索引或者创建大量索引;
固定集合;
MongoDB中可以创建大小固定的集合,称为固定集合,固定集合性能出色且适宜于很多场景;
比如:日志处理, 临时缓存;
特点:插入输入快; 顺序查询速度快; 能够淘汰早期的数据;
创建固定集合: db.createCollection(collectionname,{capped:true, size:1000, max:1000})
size:表示设置固定集合的大小, 单位kb;
max:表示固定集合中最多存放多少条文档;
> db.createCollection('log',{capped:true,size:1000,max:3})
{ "ok" : 1 }
> db.log.insert({pid:6666,cpu:0.05})
WriteResult({ "nInserted" : 1 })
> db.log.insert({pid:7777,cpu:0.17})
WriteResult({ "nInserted" : 1 })
> db.log.insert({pid:8888,cpu:0.19})
WriteResult({ "nInserted" : 1 })
> db.log.find({},{_id:0})
{ "pid" : 6666, "cpu" : 0.05 }
{ "pid" : 7777, "cpu" : 0.17 }
{ "pid" : 8888, "cpu" : 0.19 }
> db.log.insert({pid:9999,cpu:0.12})
WriteResult({ "nInserted" : 1 })
> db.log.find({},{_id:0})
{ "pid" : 7777, "cpu" : 0.17 }
{ "pid" : 8888, "cpu" : 0.19 }
{ "pid" : 9999, "cpu" : 0.12 }
>
聚合:
对数据文档进行整理统计;(更高级的查找)
db.collection_name.aggregate()
功能:聚合函数,配合聚合条件进行数据整理;
聚合操作符:
$group 分组; 按照什么分组由具体的分组操作符而定;
> db.class1.aggregate({$group:{_id:'$sex',num:{$sum:1}}})
统计聚合 分组 按照哪个域分组, 统计结果域名
$sum 求和
> db.class1.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})
$avg 求平均数
> db.class1.aggregate({$group:{_id:'$sex',num:{$avg:'$age'}}})
$min 求最小值
> db.class1.aggregate({$group:{_id:'$sex',num:{$min:'$age'}}})
$max 求最大值
> db.class1.aggregate({$group:{_id:'$sex',num:{$max:'$age'}}})
$first 第一个文档的指定值
db.class1.aggregate({$group:{_id:'$sex',name:{$first:'$name'}}})
$last 最后一个文档的指定值
db.class1.aggregate({$group:{_id:'$sex',name:{$last:'$name'}}})
++++++++++++++++++++++++++
$project 用于修饰的文档的显示效果;
值同find的第二个参数相同
db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}}) 可以改变显示的域名
$match 过滤数据
值和qurey 部分一样;
db.class1.aggregate($match:{age:18})
$limit 显示前几条数据;值为一个正数
db.class1.aggregate({$limit:3})
$skip 跳过几条数据;值为一个正数
db.class1.aggregate({$skip:3})
$sort 排序
db.class1.aggregate({$sort:{age:1}})
> show collections
book
class0
class1
class2
class3
log
> db.class2.find({},{_id:0})
{ "name" : "beijing", "msg" : "This is a big city and this is a very old city." }
{ "name" : "nanjing", "msg" : "The city is very beautiful, and this is a very old city." }
> db.class1.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "lili", "age" : 21, "sex" : "w" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
{ "title" : "python", "price" : null }
>
>
> db.class1.aggregate({$group:{_id:'$sex',num:{$sum:1}}})
{ "_id" : null, "num" : 1 }
{ "_id" : "w", "num" : 2 }
{ "_id" : "m", "num" : 2 }
> db.class1.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})
{ "_id" : null, "num" : 0 }
{ "_id" : "w", "num" : 39 }
{ "_id" : "m", "num" : 45 }
> db.class1.aggregate({$group:{_id:'$sex',num:{$avg:'$age'}}})
{ "_id" : null, "num" : null }
{ "_id" : "w", "num" : 19.5 }
{ "_id" : "m", "num" : 22.5 }
> db.class1.aggregate({$group:{_id:'$sex',num:{$min:'$age'}}})
{ "_id" : null, "num" : null }
{ "_id" : "w", "num" : 18 }
{ "_id" : "m", "num" : 21 }
> db.class1.aggregate({$group:{_id:'$sex',num:{$max:'$age'}}})
{ "_id" : null, "num" : null }
{ "_id" : "w", "num" : 21 }
{ "_id" : "m", "num" : 24 }
> db.class1.aggregate({$group:{_id:'$sex',name:{$first:'$name'}}})
{ "_id" : null, "name" : null }
{ "_id" : "w", "name" : "lili" }
{ "_id" : "m", "name" : "xiaoming" }
> db.class1.aggregate({$group:{_id:'$sex',name:{$last:'$name'}}})
{ "_id" : null, "name" : null }
{ "_id" : "w", "name" : "ailee" }
{ "_id" : "m", "name" : "tom" }
> db.class1.aggregate({$project:{_id:0,name:1,age:1}})
{ "name" : "xiaoming", "age" : 21 }
{ "name" : "lili", "age" : 21 }
{ "name" : "tom", "age" : 24 }
{ "name" : "ailee", "age" : 18 }
{ }
> db.class1.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
{ "Name" : "xiaoming", "Age" : 21 }
{ "Name" : "lili", "Age" : 21 }
{ "Name" : "tom", "Age" : 24 }
{ "Name" : "ailee", "Age" : 18 }
{ }
> db.class1.aggregate($match:{age:18})
2018-07-22T12:59:12.123+0800 E QUERY [js] SyntaxError: missing ) after argument list @(shell):1:26
> db.class1.aggregate({$match:{age:18}})
{ "_id" : ObjectId("5b530524cf01890d9630ce8e"), "name" : "ailee", "age" : 18, "sex" : "w" }
> db.class1.aggregate({$limit:3})
{ "_id" : ObjectId("5b5304cdcf01890d9630ce8b"), "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "_id" : ObjectId("5b5304e0cf01890d9630ce8c"), "name" : "lili", "age" : 21, "sex" : "w" }
{ "_id" : ObjectId("5b5304f4cf01890d9630ce8d"), "name" : "tom", "age" : 24, "sex" : "m" }
> db.class1.aggregate({$limit:3},{_id:0})
2018-07-22T13:03:04.327+0800 E QUERY [js] Error: command failed: {
"ok" : 0,
"errmsg" : "Unrecognized pipeline stage name: '_id'",
"code" : 40324,
"codeName" : "Location40324"
} : aggregate failed :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:18:14
_assertCommandWorked@src/mongo/shell/assert.js:534:17
assert.commandWorked@src/mongo/shell/assert.js:618:16
DB.prototype._runAggregate@src/mongo/shell/db.js:260:9
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1056:12
@(shell):1:1
> db.class1.aggregate({$skip:3})
{ "_id" : ObjectId("5b530524cf01890d9630ce8e"), "name" : "ailee", "age" : 18, "sex" : "w" }
{ "_id" : ObjectId("5b532396cf01890d9630ce97"), "title" : "python", "price" : null }
> db.class1.aggregate({$sort:{age:1}})
{ "_id" : ObjectId("5b532396cf01890d9630ce97"), "title" : "python", "price" : null }
{ "_id" : ObjectId("5b530524cf01890d9630ce8e"), "name" : "ailee", "age" : 18, "sex" : "w" }
{ "_id" : ObjectId("5b5304cdcf01890d9630ce8b"), "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "_id" : ObjectId("5b5304e0cf01890d9630ce8c"), "name" : "lili", "age" : 21, "sex" : "w" }
{ "_id" : ObjectId("5b5304f4cf01890d9630ce8d"), "name" : "tom", "age" : 24, "sex" : "m" }
>
集合管道;
定义:前一个聚合操作的结果给后一个聚合操作执行;
格式: 将多个聚合操作放到一个【】中
match 结果 -----> sort排序---> project 显示
db.class1.aggregate([{$match:{sex:'m'}},{$sort:{age:1}},{$project:{_id:0}}])
db.class1.aggregate([{$match:{sex:'w'}},{$sort:{age:1}},{$project:{_id:0}}])
> db.class1.aggregate([{$match:{sex:'m'}},{$sort:{age:1}},{$project:{_id:0}}])
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
{ "name" : "tom", "age" : 24, "sex" : "m" }
> db.class1.aggregate([{$match:{sex:'w'}},{$sort:{age:1}},{$project:{_id:0}}])
{ "name" : "ailee", "age" : 18, "sex" : "w" }
{ "name" : "lili", "age" : 21, "sex" : "w" }
> db.class1.aggregate([{$match:{sex:'w'}},{$sort:{age:-1}},{$project:{_id:0}}])
{ "name" : "lili", "age" : 21, "sex" : "w" }
{ "name" : "ailee", "age" : 18, "sex" : "w" }
> db.class1.aggregate([{$match:{sex:'m'}},{$sort:{age:-1}},{$project:{_id:0}}])
{ "name" : "tom", "age" : 24, "sex" : "m" }
{ "name" : "xiaoming", "age" : 21, "sex" : "m" }
>
练习:
1,按照性别进行分组,统计每组人数;db.grade.aggregate({$group:{_id:'$sex',num:{$sum:1}}})
2,按照学生姓名分组,过滤出有重名的同学; db.class0.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
3,统计每名男生的语文分数; > db.class0.aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'scource.chinese':1}}])
4,将女生按照英语分数降序排列;> db.class0.aggregate([{$match:{sex:'w'}},{$sort:{'source.english':-1}}])
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ], "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ], "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "sun", "shell", "linux", "English" ], "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ], "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z"), "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "title" : "python精通", "date" : ISODate("2018-07-21T11:56:35.156Z"), "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "title" : "python疯狂", "date" : "Sat Jul 21 2018 19:58:00 GMT+0800 (CST)", "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "title" : "python仿生", "date" : 1532174439187, "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
> db.class0.insert({name:'tom'})
WriteResult({ "nInserted" : 1 })
> db.class0.find({},{_id:0})
{ "name" : "xiaoming", "age" : 21, "sex" : "m", "learn" : [ "match", "English", "chinese" ], "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ], "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "name" : "tom", "age" : 24, "sex" : "m", "learn" : [ "sun", "shell", "linux", "English" ], "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ], "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "title" : "python", "date" : ISODate("2018-07-21T11:50:15.709Z"), "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "title" : "python精通", "date" : ISODate("2018-07-21T11:56:35.156Z"), "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "title" : "python疯狂", "date" : "Sat Jul 21 2018 19:58:00 GMT+0800 (CST)", "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "title" : "python仿生", "date" : 1532174439187, "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "name" : "tom" }
> db.class0.aggregate([$group:{_id:'$name',num:{$sum:1}}])
2018-07-22T14:04:46.817+0800 E QUERY [js] SyntaxError: missing ] after element list @(shell):1:27
> db.class0.aggregate([{$group:{_id:'$name',num:{$sum:1}}}])
{ "_id" : null, "num" : 4 }
{ "_id" : "lili", "num" : 1 }
{ "_id" : "xiaoming", "num" : 1 }
{ "_id" : "tom", "num" : 2 }
{ "_id" : "ailee", "num" : 1 }
> db.class1.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
> db.class0.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
{ "_id" : null, "num" : 4 }
{ "_id" : "tom", "num" : 2 }
> db.class0.aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'scource.chinese':1}}])
{ "name" : "xiaoming" }
{ "name" : "tom" }
> db.class0.aggregate([{$match:{sex:'w'}},{$sort:{'source.english':-1}}])
{ "_id" : ObjectId("5b530c47cf01890d9630ce90"), "name" : "lili", "age" : 21, "sex" : "w", "learn" : [ "match", "chinese" ], "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
{ "_id" : ObjectId("5b530cc3cf01890d9630ce92"), "name" : "ailee", "age" : 18, "sex" : "w", "learn" : [ "chinese" ], "source" : { "chinese" : 88, "englis" : 78, "math" : 98 } }
>
MongDB篇,第三章:数据库知识3的更多相关文章
- MongDB篇,第一章:数据库知识2
MongDB 数据库知识2 非关系型数据库和关系型数据库的比较1. 不是以关系模型构建数据结构,结构比较自由 不保证数据的一致性2. 非关系型数据库弥补了关系型数据库的一些不足,能 够在处理高并 ...
- MongDB篇,第一章:数据库知识1
MongDB 数据库知识1 程序 = 数据结构 + 算法 数据存储阶段 1,文件管理阶段 (.txt .doc .xls) 优点: 数据可以长期保存:可以存储大量的数据:使用简单 缺点 ...
- Java语言程序设计(基础篇) 第三章 选择
第三章 选择 3.8 计算身体质量指数 package com.chapter3; import java.util.Scanner; public class ComputeAndInterpret ...
- 使用MYSQL数据库实现编程----第二章第三章课堂知识小总结
第二章1:创建数据库create database myschool 2.数据类型 1.整型 int 2.小数 double 精确度要求高的 ----Decimal(18,4) 2222222 ...
- 明解C语言 入门篇 第三章答案
练习3-1 #include <stdio.h> int main() { int x; int y; puts("请输入两个整数."); printf("整 ...
- Java编程基础篇第三章
逻辑运算符 与(&)(&&),或(||)(|),非(!) &和&&的区别 &:无论&的左边真假,右边都进行运算 &&:当 ...
- 明解C语言 中级篇 第三章答案
练习3-1 /* 猜拳游戏(其四:分割函数/显示成绩)*/ #include <time.h> #include <stdio.h> #include <stdlib.h ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...
随机推荐
- Binary Analysis Tool安装使用教程
Binary Analysis Tool(BAT)是一个用于检测二进制文件使用到的开源组件,协助及早发现程序发布后可能会面临的开源协议解执的开源免费检测工具. 一.安装BAT和bat-extratoo ...
- radio选择
input标签radio单选 <tr> <th style="font-weight: bolder;text-align: right;width:18%" & ...
- java⑦
1. 逻辑运算符 * 01. && 短路与 并且的关系 * 表达式1 && 表达式2 * 001.如果 表达式1为false,则不执行 表达式2 * 002.表达式1, ...
- word-wrap与break-word属性的区别
共同点 word-wrap:break-word与word-break:break-all都能把长单词强行断句 不同点 word-wrap:break-word会首先起一个新行来放置长单词,新的行还是 ...
- 5.1 C++基本操作符重载
参考:http://www.weixueyuan.net/view/6379.html 总结: 操作符重载指的是将C++提供的操作符进行重新定义,使之满足我们所需要的一些功能. 长度运算符“sizeo ...
- Zynq-PL中创建AXI Master接口IP及AXI4-Lite总线主从读写时序测试(转)
转载:原文 http://www.eefocus.com/antaur/blog/17-08/423751_6cc0d.html 0. 引言 通过之前的学习,可以在PL端创建从机模式的AXI接口IP ...
- Xilinx SDK编译Microblaze时出错
reference:http://www.eeboard.com/evaluation/digilent-cmod-a7-fpga/9/ 在vivado 2015.4中创建microblaze软核,l ...
- Ubuntu16.04 安装Teamviewer
有时需要远程控制ubuntu系统的电脑,Teamviewer在linux下也可以进行安装,大致看了下向日葵在linux下配置好像比较麻烦,而且Teamviewer远程控制的流畅性一直不错,就选择安装T ...
- git中误删提交(commit)后,怎么恢复
“xml文件存储数据”提交被我误操作,即使用reset --hard删除了,然后又进行了三次提交,发现删除的提交有用,需要找回来, 于是找了好久,找到好方法: 1.进入工程下的.git文件下,git ...
- mybatis学习(五)----实现关联表查询
一.一对一的表查询 查询班级表中班级号为1的对应的记录(包括教师的具体信息) 1.首先建立数据表 数据表class和techear,class表中只有一个外键techear_id,sql脚本如下: C ...