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:'78'}}) $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:[78],$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 } } >