Mongodb基本语法:
Mongo使用数据库
Mongod开机
Mongoimport导入数据
Nosql:非关系型数据库,mongodb是其中一个
[if !supportLists]1、[endif]通过Mongo连接,默认连接的是test数据库(这个数据库不可删,是mongodb安装的时候自带的)
[if !supportLists]2、[endif]mongodb与其他数据库相比,关系型数据库必须创建表和字段,否则无法使用
但是mongodb属于“无状态模式”,结构不需要设计,直接使用即可,存什么东西取决于我们自己向他传入什么!(当不存在则创建)
由于市场普标称之为表,所以mongodb做了兼容语法处理
显示所有数据库:show dbs / show databases(都是一样的)
显示所有集合/表:show collections / show tables(都是一样的)
显示当前使用数据库:db / db.getName();
数据库状态:db.stats()
资料:https://docs.mongodb.com/manual/reference/command/dbStats/#dbcmd.dbStats
"db" : "dnedu",:表示当前是针对“数据库”的描述
"collections" : 3,:表示当前数据库有多少个collections,当然也可以通过showcollections
"objects" : 14,:表示当前数据库所有collection总共有多少行数据,但是只是一个估计值,并不是非常的精准
"avgObjSize" : 60.142857142857146,:每行数据的大小,也是估计值
"dataSize" : 842,:当前数据库所有数据的总大小
"storageSize" : 90112,表示当前数据库占有磁盘大小,单位bytes
"numExtents" : 0,:包含所有集合中数据库中扩展数量的计数
"indexes" : 3,
"indexSize" : 90112,
"ok" :1
[if !vml]
[endif]
控制台运算
[if !vml]
[endif]
写入数据:
一:普通数据添加方式:
插入数据是咱们熟悉的“json”格式,而在mongodb实际上使用的语法称之为”bson”
BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
db.product.insert({name:"xiaomi6",price:1999,weight:140,number:40,area:{province:"beijing",city:"beijing"}})
db.product.insert({name:"huawei01",price:2999,weight:120,number:20,area:{province:"shenzhen"}})
当集合(product)不存在则创建一个新的集合,插入的数据格式基本和json一样
[if !vml]
[endif]
二:多维数组对象添加:
db.product.insert({name:"xiaomi6",price:1999,weight:140,number:40,area:{province:"beijing",city:"beijing"}})
三:数组信息的添加
db.product.insert({name:"xiaomi6",price:1999,weight:140,number:40,color:[‘red’,’black’,’yellow’]})
我们不可能一条一条的数据去插入,所以可以直接导入json文件批量插入文档
mongoimport--db dnedu--collection product--drop--file dr.json
注意--drop是先删除后导入,也可以不用--drop不删除直接导入
数据查询:
笼统查询:
查询所有数据:db.product.find()
[if !vml]
[endif]
查询第一条数据:db.product.findOne();
[if !vml]
[endif]
条件限制查询:db.product.find({name:"huawei01"})
类似于Mysql命令:select * from表名where name = “huawei01”
[if !vml]
[endif]
[if !vml]
[endif]
ID:id的字段内容值是mongodb本身算法获得的,该_id对应的值信息在“全球唯一”,相当于Mysql当中的主键id,是唯一的,该id可以自行设置,但是不推荐
范围查询
关键字:$gt$lt$gte$lte
Mongodb里面的字段单引号和双引号都可以,随意,只是在PHP由于会把$解释运行,所以php不行
查询price大于2500的数据db.product.find({price:{'$gt':2500}})
[if !vml]
[endif]
查询price小于2500的数据db.product.find({price:{'$lt':2500}})
[if !vml]
[endif]
设置多个查询条件:
查询price大于2500,weight小于100的数据
db.product.find({price:{'$gt':2500},weight:{'$lt':100}})
[if !vml]
[endif]
查询price大于2500,weight等于20的数据
db.product.find({price:{'$gt':2500},weight:20})
[if !vml]
[endif]
多维字段查询:
查询area里面的province等于changsha
db.product.find({'area.province':"changsha"})
[if !vml]
[endif]
数组条件查询:
查询color带有red的数据(包含一个)
db.product.find({color:’red’});
[if !vml]
[endif]
查询color带有red和black的数据(必须包含两个)
db.product.find({color:{‘$all’:[‘red’,’black’]}})
自己扩展db.product.find({color:{‘$all’:[{a.name:”huawei”},{b.color:”blue”}]}})数组套对象
db.product.find({color:{‘$all’:[[“red”,”blue”
]])数组套数组
[if !vml]
[endif]
$or,多个条件,满足其一即可
price等于3000或number小于100
db.product.find({'$or':[{price:3000},{number:{'$lt':100}}]})
[if !vml]
[endif]
限制查询字段:
查询数据price等于3000,数据只显示name
db.product.find({price:3000},{name:1}),这条语句有id
db.product.find({price:3000},{name:1,_id:0}):这条语句真的就只有name字段了
1.表示查询显示此字段0.表示排除不显示此字段
如果你需要,比如name为1,price为0,那么会报错,因为mongodb的规则(可以都为1,页可以都为0)就是要输出就全部输出,要么不输出就全部不输出,_id除外,可以随意设置0,1,
db.product.find({price:3000},{name:1,price:0,_id:0})
[if !vml]
[endif]
修改数据:
关键字:$set
修改name等于huawei06的字段,但只修改了一条
db.product.update({name:"huawei06"},{'$set':{name:"updatebefore name"}});
[if !vml]
[endif]
如果修改语句中,没有$set,会导致删除其他除id外的所有字段,然后保留我们自己设置的字段,会有下面这张黑图的字段变为下面的图片所剩的字段
[if !vml]
[endif]
[if !vml]
[endif]
如果修改的字段没有则创建,如果执行以下命令
db.product.update({name:"huawei07"},{history:"idon't know"})
[if !vml]
[endif]
上面这条语句会删除其他除id以外的所有字段,然后创建hisotry字段
删除数据:删除所有name等于huawei03的数据
db.product.remove({name:"huawei03"})[if !vml]
[endif]
删除字段:db.product.update({name:"huawei04"},{'$unset':{name:1}});,只会删除一条
[if !vml]
[endif]
模糊查询
collection.find({name: new RegExp("^.*"+name+".*$")})
查询大于小于不等于
$gt $gte $lt $lte $ne
查询表信息
db.table.status()
db.table.status().count//表的个数
查询的数据长度
count =db.table.find().count();
数据量小的分页查询
db.user.find({name:/^zhangsan2/}).sort({"index":-1}).skip(110).limit(10)
数据量大查询分页(优化)
db.user.find({name:/^zhangsan2/,index:{"$lt":299890}}).sort({"index":-1}).limit(10)
查询后排序
db.user.find({name:/^zhangsan2/}).sort({"index":-1})
查看一个查询(find)的explain()输出信息,可以知道查询使用了哪个索引,以及是如何使用的。
db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
查询num的数组值具有指定大小的document
最好的方法是使用$size,例如指定大小为2,可以:
复制代码代码如下:
db.data.find({num:{$size:2}})
不过$size有一个缺陷,就是无法查询某个范围的大小,例如下面的语句是无法按照预期运行的:
复制代码代码如下:
db.data.find({num:{$size:{$gt:2}}}); //错误
官方文档中建议,如果需要查询的数组大小在某个范围,可以另外为每个文档添加一个键来保存当前数组的大小。
如果数组大小是某个范围
另外两种思路,第一个思路是使用$where,例如如果要求数组大小小于3:
复制代码代码如下:
db.data.find({ $where:"this.num.length < 3" })
这种方法具有很大的灵活性,但是速度会慢一些。
关于$where,请参考官方文档:http://docs.mongodb.org/manual/reference/operator/query/where/。
另外一个比较高效的方法是判断数组中的某个指定索引的元素是否存在,例如如果要求数组大小小于3:
复制代码代码如下:
db.data.find({ "num.2":{$exists:0} })
数组大小小于3,就意味着num[2]不存在。
如果要求数组大小大于3,可以:
复制代码代码如下:
db.data.find({ "num.3":{$exists:1} })