mongo学习笔记---1
Posted 六点
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongo学习笔记---1相关的知识,希望对你有一定的参考价值。
mongo简介
非结构化数据库,数据都是以Bson格式(json的二进制)存储的。
特点:不需要指定表结构,存在一张表里的数据其结构可以完全不同。内部执行引擎为JS解释器, 把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的js语法来操作。
应用场景举例:类似网易云音乐一个音乐下有很多评论,评论之间又可以互相评论,评论下还可以点赞。这样的数据结构如果是按照关系型数据库,可能需要电影表,评论表,点赞表,用户表他们之间又有1对多和多对多的关系,这会造成复杂的查询。而在mongo中可能它只需要一个对象(json的结构)就可以保存如下所示
{
song:’双节棍’,
comments:[
{content:’很好听’,user_id:1,good:[{user:1,time:‘2017-01-01‘},{user:3,time:‘2017-01-23‘},{user:4,time:‘2017-05-01‘}]},
{content:’一般吧’,user_id:2}
]
}
1: mongo入门命令
show dbs 查看当前的数据库
use databaseName 选库
show tables/collections 查看当前库下的collection
Mongodb的库是隐式创建,你可以use 一个不存在的库,然后在该库下创建collection,即可创建库
db.createCollection(‘collectionName’) 创建collection
db.collectionName.insert({}); collection允许隐式创建
db.collectionName.drop() 删除collection
db.dropDatabase(); 删除database 在use一个database后执行
2:mongo增删改查命令
插入 insert:
db.collectionName.insert({_id:9,gender:‘male‘,name:‘QQ‘}) 插入单条并指定id;mongo会自动指定id给一条数据
db.collectionName.insert( [ {time:‘friday‘,study:‘mongodb‘}, {_id:9,gender:‘male‘,name:‘QQ‘} ] ) 插入多条记录
删除 remove:
删除必要要执行条件{} 不然将清空表
db.collectionName.remove({name:’001’}); 删除name属性为001的全部数据
db.collectionName.remove({name:’001’,true}); 只删除name属性为001的一行数据
更改 update:
db.news.update({name:‘QQ‘},{name:‘MSN‘});是指选中news表中,name值为QQ的文档,并把其文档值改为{name:’MSN’}相当于重新赋值
db.collectionName.update({name:‘MSN‘},{$set:{name:’QQ’},$unset:{age:1}}) 如果是想修改文档的某列,使用$set关键字,如果不存在该字段,就会自动添加上
修改时的赋值表达式: $set 修改某列的值 $unset 删除某个列 $rename 重命名某个列 $inc 增长某个列
Option: {upsert:true/false,multi:true/false}
upsert---是指没有匹配的行,则直接插入该行.(和mysql中的replace一样)
例:db.stu.update({name:‘wuyong‘},{$set:{name:‘junshiwuyong‘}},{upsert:true});
如果有name=’wuyong’的文档,将被修改,如果没有,将添加此新文档
multi: 是指修改多行(即使查询表达式命中多行,默认也只改1行,如果想改多行,可以用此选项)
例:db.news.update({age:21},{$set:{age:22}},{multi:true}); 则把news中所有age=21的文档,都修改
查询 find :
以下为转载内容,很全面。
1 左边是mongodb查询语句,右边是sql语句。对照着用,挺方便。 2 db.users.find() select * from users 3 db.users.find({"age" : 27}) select * from users where age = 27 4 db.users.find({"username" : "joe", "age" : 27}) select * from users where "username" = "joe" and age = 27 5 db.users.find({}, {"username" : 1, "email" : 1}) select username, email from users 6 db.users.find({}, {"username" : 1, "_id" : 0}) // no case // 即时加上了列筛选,_id也会返回;必须显式的阻止_id返回 7 db.users.find({"age" : {"$gte" : 18, "$lte" : 30}}) select * from users where age >=18 and age <= 30 // $lt(<) $lte(<=) $gt(>) $gte(>=) 8 db.users.find({"username" : {"$ne" : "joe"}}) select * from users where username <> "joe" 9 db.users.find({"ticket_no" : {"$in" : [725, 542, 390]}}) select * from users where ticket_no in (725, 542, 390) 10 db.users.find({"ticket_no" : {"$nin" : [725, 542, 390]}}) select * from users where ticket_no not in (725, 542, 390) 11 db.users.find({"$or" : [{"ticket_no" : 725}, {"winner" : true}]}) select * form users where ticket_no = 725 or winner = true 12 db.users.find({"id_num" : {"$mod" : [5, 1]}}) select * from users where (id_num mod 5) = 1 13 db.users.find({"$not": {"age" : 27}}) select * from users where not (age = 27) 14 db.users.find({"username" : {"$in" : [null], "$exists" : true}}) select * from users where username is null // 如果直接通过find({"username" : null})进行查询,那么连带"没有username"的纪录一并筛选出来 15 db.users.find({"name" : /joey?/i}) // 正则查询,value是符合PCRE的表达式 16 db.food.find({fruit : {$all : ["apple", "banana"]}}) // 对数组的查询, 字段fruit中,既包含"apple",又包含"banana"的纪录 17 db.food.find({"fruit.2" : "peach"}) // 对数组的查询, 字段fruit中,第3个(从0开始)元素是peach的纪录 18 db.food.find({"fruit" : {"$size" : 3}}) // 对数组的查询, 查询数组元素个数是3的记录,$size前面无法和其他的操作符复合使用 19 db.users.findOne(criteria, {"comments" : {"$slice" : 10}}) // 对数组的查询,只返回数组comments中的前十条,还可以{"$slice" : -10}, {"$slice" : [23, 10]}; 分别返回最后10条,和中间10条 20 db.people.find({"name.first" : "Joe", "name.last" : "Schmoe"}) // 嵌套查询 21 db.blog.find({"comments" : {"$elemMatch" : {"author" : "joe", "score" : {"$gte" : 5}}}}) // 嵌套查询,仅当嵌套的元素是数组时使用, 22 db.foo.find({"$where" : "this.x + this.y == 10"}) // 复杂的查询,$where当然是非常方便的,但效率低下。对于复杂查询,考虑的顺序应当是 正则 -> MapReduce -> $where 23 db.foo.find({"$where" : "function() { return this.x + this.y == 10; }"}) // $where可以支持javascript函数作为查询条件 24 db.foo.find().sort({"x" : 1}).limit(1).skip(10); // 返回第(10, 11]条,按"x"进行排序; 三个limit的顺序是任意的,应该尽量避免skip中使用large-number
以上是关于mongo学习笔记---1的主要内容,如果未能解决你的问题,请参考以下文章
Docker学习笔记——Mongo Dockerfile及容器运行