自己设置_id,但是必须要保证唯一,如果不唯一,插入数据会报错
db.colname.insert({_id:'values'})
删除集合
db.colname.drop()
update 更改文档
db.colname.update({条件},{$set:{age:20}})
全文档替换
db.colname.update({条件},{age:20})
更改查到的所有数据(multi默认是false)
指定属性更新 通过set
db.colname.update({条件},{$set:{age:20}},{multi:true})
upsert:true找不到数据新插入一条
> db.students.update({name:'芮雪'},{name:'丽水'},{upsert:true})
若_id这个文档已存在,那么全文档覆盖,反之,新插入一行
db.colname.save({_id:'values',name:'',age:''})
若不跟_id,相当于insert插入数据,效率低
db.colname.save({name:'',age:''})
remove 移除,删除
删除所有
db.colname.remove({条件})
删除一条
db.colname.remove({条件},{justOne:true})
db.colname.remove({条件},1)
查
db.colname.find()
db.colname.find({条件})
方法findOne():查询,只返回第一个
db.集合名称.findOne({条件文档})
方法findMany():查询,返回多个
db.集合名称.findMany({条件文档,条件文档,.......})
方法pretty():将结果格式化
db.集合名称.find({条件文档}).pretty()
比较运算符
db.colname.find({name:'',age:''})
$lt 小于
db.colname.find({age:{$lt:20}})
$lte 小于等于
db.colname.find({age:{$lte:20}})
$gt 大于
db.colname.find({age:{$gt:20}})
$gte 大于等于
db.colname.find({age:{$gte:20}})
$ne 不等于
db.colname.find({age:{$ne:20}})
逻辑运算符
在mongodb中和就是在同一级下写两个条件,它们的关系默认为“和”
db.stu.find({age:{$gte:18},gender:1})
或:$or
db.stu.find({$or:[{age:{$gt:18}},{gender:1}]})
范围运算符
$in 相当于或者
db.colname.find(age:{$in:[23,24,52]})
$nin 不在某个范围
db.colname.find(age:{$nin:[23,24,52]})
正则
/正则表达式/
{key:{$regex:'正则表达式'}}
db.colname.find({key:/正则...})
db.colname.find({key:{$regex:'正则表达式'}})
可以自定义函数
db.students.find({$where:function(){return this.gender=='女'}})
type 查找指定类型的文档
db.colname.find({title:{$type:'string'}})
另附:type操作符和可用数字代替,详见https://docs.mongodb.com/manual/reference/operator/query/type/
limit:返回限定的条数
db.students.find().limit(2)
skip 跳过指定数量的数据
db.students.find().skip(2)
跳过指定条数,返回限定的条数(skip与limit的先后顺序无关)
db.students.find().limit(2).skip(2)
db.students.find().skip(2).limit(2)
格式化显示
pretty
db.colname.find().pretty()
sort 排序 (1表示升序,-1表示降序)
b.colname.find({条件}).sort({age:1})
b.colname.find({条件}).sort({age:1,salary:-1})
若将skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
distinct 去重
db.colname.distinct('字段名',{条件})
投影 (相当于MySQL中的检索列的功能)
在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段
语法: 参数为字段与值,值为1表示显示,值为0不显
除了年龄这个字段不返回之外,其他都返回
db.colname.find({},{age:0,name:0})
除了年龄之外其他的文档都不给返回 _id必反
db.colname.find({},{age:0})
count 统计数量
db.colname.find({条件}).count()
统计所有
db.colname.count()
聚合
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
首先创建一个可以查询的集合
{ "_id" : ObjectId("5b7d0c6e6a6ac01e5ef950dc"), "title" : "MongoDB Overview", "description" : "MongoDB is no sql database", "by_user" : "w3cschool.cc", "url" : "http://www.w3cschool.cc", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5b7d0c6e6a6ac01e5ef950dd"), "title" : "NoSQL Overview", "description" : "No sql database is very fast", "by_user" : "w3cschool.cc", "url" : "http://www.w3cschool.cc", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 10 }
{ "_id" : ObjectId("5b7d0c6e6a6ac01e5ef950de"), "title" : "Neo4j Overview", "description" : "Neo4j is no sql database", "by_user" : "Neo4j", "url" : "http://www.neo4j.com", "tags" : [ "neo4j", "database", "NoSQL" ], "likes" : 750 }
{ "_id" : ObjectId("5b7d0d0c6a6ac01e5ef950df"), "title" : "python", "description" : "this is a python book", "by_user" : "123_abcd", "url" : "http://www.baidu.com/", "tags" : [ "mongodb", "mysql", "redis" ], "likes" : 800 }
管道
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
$group:将集合中的文档分组,可用于统计结果。
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$sort:将输入文档排序后输出。
根据by_user分组
db.books.aggregate([{$group:{_id:'$by_user',count:{$sum:1}}}])
_id 为空的时候,统计每个分组下的文档数量
db.books.aggregate([{$group:{_id:'null',count:{$sum:1}}}])
当然也可以计算平均值、最小值、最大值等等 ,用法和以上求和相同。
$first 返回分组文档里面的第一个文档中的某个字段
db.books.aggregate([{$group:{_id:'$by_user',url:{$first:'$url'}}}])
$last 返回分组文档里面的最后一个文档中的某个字段
db.books.aggregate([{$group:{_id:'$by_user',url:{$last:'$url'}}}])
$push 可以将分组文档中的某个字段,以数组的形式返回
db.books.aggregate([{$group:{_id:'$by_user',push:{$push:'$url'},.....}}])
db.books.aggregate([{$group:{_id:'$by_user',push:{$push:'$$ROOT'}}}])
$project
修改输入文档的结构, 可以用来重命名增加或删除域也可以用于创建计算结果以及嵌套文档
同样的 1 表示选中的数据 0 表示反选
db.colname.aggregate([{$project:{'字段':1}}])
db.colname.aggregate([{$project:{'字段':0}}])
$match:
用于过滤数据,只输出符合条件的文档。
db.books.aggregate({$match:{likes:{$gte:700,$lt:900},}})
返回likes字段中的大于700 小于900的数据
当然也可以管道和投影同时使用
db.books.aggregate([{$group:{_id:'$bu_user',count:{$sum:1}}},{$project:{title:1,_id:0,title:0}}])
$unwind
将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
db.books.aggregate([{$unwind:'$tags'}])
此外还有一些在实际操作中一般依赖于match而作用的方法
如sort、limit、skip等。
用法上面提过了在这里就不多过赘述了。