MongoDB常用命令

查看当前数据库:db
查看所有数据库:show dbs / show databases
切换数据库(不存在则创建,在没有真正插入数据以前,使用show dbs,查看不到):use database_name
删除当前数据库:db.dropDatabase()


创建集合:
  创建空集合:db.createCollection(name,options)
    db.createCollection('ts1')
    db.createCollection('ts2', {capped:true,size:10})
  capped:默认值false表示不设置上限,true表示设置上限
  size:当capped为true时需要指定该参数,表示上限大小,当文件到达上限时,会将之前的数据覆盖,单位为字节
  使用插入命令,集合不存在则创建:db.ts2.insert({name:"xiaohong"})


数据类型
  Object ID:文档ID
  string:字符串,必须是有效的utf-8
  Boolean:布尔类型false或者true
  integer:整型
  double:浮点型
  arrays:数组或者列表,多个值存储到一个键
  object:用于嵌入式的文档,即一个值为一个文档
  null:存储Null值
  timestamp:时间戳
  date:存储当前日期或者时间的Unix时间格式

查看所有集合:show collections
删除集合:db.ts1.drop()
集合中插入数据:
  insert:当插入的数据的__id相同时会报错
  db.ts2.insert({_id:111,name:"xiaohong"})
  db.ts2.insert({_id:111,name:"aaa"})
  save:当插入的数据的__id相同时会直接修改
查看集合中的数据:
  db.集合名.find({条件文档}) 返回符合条件的全部
  db.集合名.findOne({条件文档}) 返回符合条件的第一条
  db.集合名.find({条件文档}).pretty() 将返回结果按格式输出
    db.ts2.find({age:18}) 等于18
    db.ts2.find({age:18,name:"xiaohong"}) 年龄等于18且名字是xiaohong
    db.ts2.find({$or:[{age:18},{age:20}]}) 年龄等于18或者20岁的
    db.ts2.find({$or:[{age:18},{age:20}],{name:"xiaohong"}}) 年龄等于18或者20岁的且名字为xiaohong
    db.ts2.find({age:{$lte:18}}) 小于等于18
    db.ts2.find({age:{$gte:18}}) 大于等于18
    db.ts2.find({age:{$ne:18}}) 不等于18
    db.ts2.find({age:{$in:[12,16,18]}}) 年龄属于12,16,18
    db.ts2.find({age:{$nin:[12,16,18]}}) 年龄不属于12,16,18
    db.ts2.find({name:/^abc/}) 名字以abc开头的
    db.ts2.find({name:{$regex:"^abc"}}) 名字以abc开头的
    db.ts2.find({age:18}).limit(2) 显示头两条
    db.ts2.find({age:18}).skip(2) 跳过头两条,显示剩下的
    db.ts2.find({age:18}).skip(2).limit(5) 指定显示从第三条开始之后的5条
    db.ts2.find({$where:function(){return this.age<=18}}) 返回年龄大于18的所有字段
    db.ts2.find({$where:function(){return this.age<=18}},{name:1,__id:0}) 返回年龄大于18的name字段,__id默认显示,其他字段不显示不能写name:0,会报错,直接不写就好了
    db.ts2.find({age:18}).sort({age:1}) 将返回结果按年龄升序排序
    db.ts2.find({age:18}).sort({age:-1}) 将返回结果按年龄降序排序
    db.ts2.find({age:18}).sort({age:-1,name:1}) 将返回结果按年龄降序且名字升序排序
    db.ts2.find({},{name:1}) 返回所有记录的name属性键值
    db.ts2.find({age:18}).count() 返回年龄等于18的记录数
    db.ts2.count({age:18}) 返回年龄等于18的记录数
    db.ts2.distinct("name") 返回不重名的数组
    db.ts2.distinct("name",{age:{$gt:18}}) 返回不重名的,且年龄大于18的数组

更新:db..update(<query>,<update>,{multi:<boolean>})
  query:查询条件
  update:更新操作符
  multi:可选,默认是false,表示只更新找到的第一条记录,true更新所有满足条件的文档,必须和$set合用
  db.ts2.update({name:"xiaogang"},{name:"xiaohong"}) 如果原来的集合中还如除name中的其他键,则通通会消失,这条命令是替换的意思

  db.ts2.update({name:"xiaogang"},{$set:{name:"xiaohong"}}) 只改变name对应的值,集合中其它键值不变,只更新一条符合条件的文档

  db.ts2.update({name:"xiaohong"},{$set:{name:"yses"}},{multi:true}) 只改变name对应的值,集合中其它键值不变

删除:db.ts2.remove(<query>,{justOne:<boolean>})
  query:可选,删除文档的条件
  justOne:可选,默认false,删除全部符合条件的,true只删除查找到的第一条符合条件的文档
  db.ts2.remove({name:"xiaohong"},{justOne:true})

数据的备份和恢复:
  备份语法(ubantu命令终端):mongodump -h dbhost -d dbname -o dbdirectory
    -h 服务器地址,也可以指定端口
    -d 需要备份的数据库名称
    -o 备份数据存放位置,此目录中存放着备份出来的地址
    mongodump -h 192.268.1.1:27017 -d test1 -o /usr/local/mongodb/data/
  恢复:mongorestore -h dbhost -d dbname --dir dbdirectory
    -h 服务器地址
    -d 需要恢复的数据库实例
    --dir 备份数据所在位置
    mongorestore -h 192.268.1.1:27017 -d test2 --dir /usr/local/mongodb/data/test1

聚合:是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果
  db.集合名.aggregate({管道:{表达式}})
  常用管道命令:
    $gruop 将集合中的文档分组,可用于统计结果
      $group 对应的字典有几个键,结果中就有几个键
      分组依据需要放置_id后面
      取不同的字段的值需要使用$
      去字段嵌套的字段中的值的时候 $_id.country
      能够同时按照多个键进行分组 {$group:{_id:{country:"$country",province:"$province"}}}
      db.stu.aggregate(
        {
          $group:{_id:"$gender",count:{$sum:1},avg_age:{$avg:"$age"}}
        }
      )

      使用$group统计整个文档
      db.stu.aggregate(
        {$group:{
          _id:null,count:{$sum:1},mean_age{$avg:"$age"}}
        }
      )
      db.stu.aggregate(
        {
          $group:{
            _id:null,count:{$sum:1},mean_age{$avg:"$age"}
          }
        },
      {$project:{gender:$_id,conut:1,mean_age:1,_id:0}}
      )

    $match 过滤数据,只输出符合条件的文档
    $project 修改文档的输出结构,如重命名、增加、删除字段、创建计算结果
    $sort 将输入文档排序后输出
    $limit 限制聚合管道返回的文档数
    $skip 跳过指定数量的文档,返回剩余文档
    $unwind 将数组类型的字段进行拆分
表达式:
  $sum 计算总和,$sum:1 表示以一倍计数
  $avg 平均值
  $min 最小值
  $max 最大值
  $push 在结果文档中插入值到一个数组中
  $first 根据资源文档的排序获取第一个文档数据
  $last 根据资源文档的排序获取最后一个文档数据


创建索引:提升查询速度
测试:插入10万条数据到数据库
  for(i=0,i<100000;i++){db.t245.insert({name:"test"+i,age:i})}
  db.t245.find({name:"test10000"}).explain("executionStats") 查看本次查询花费时间
建立索引 db.t245.ensureIndex({name:1}) 按照name创建索引,1表示升序,-1表示降序
在默认情况下索引字段的值可以相同
创建唯一索引(索引的值是唯一的)
建立索引 db.t245.ensureIndex({name:1},{"unique":true})
建立联合索引,解决单条索引无法去重的问题 db.t245.ensureIndex({name:1},{age:1})
删除索引:db.t245.dropIndex({name:1})

python操作MongoDB
from pymongo import MongoClient
# 实例化client,建立连接
client = MongoClient(host='localhost', port=27017)
# 选择数据库和集合
collection = client["test"]["t245"]
# 插入数据,返回的是id字符串
ret = collection.insert({"name":"xiaowang","age":10})
# 插入多条数据
data_list = [{"name":"test{}".format(i)} for i in range(10)]
collection.insert_many(data_list)
# 查询一个记录,返回字典
ret1 = collection.find_one({"name":"xiangwang"})
# 查询所有记录,返回游标对象,像迭代器,只能循环一次,再循环取不到数
ret2 = collection.find({"name":"xiangwang"})
for ret in ret2:
print(ret)

原文地址:https://www.cnblogs.com/kogmaw/p/12533145.html