跳至主要內容

MongoDB常用语句

yyshino大约 8 分钟

提示

​ MongoDB常用语句 | 非关系数据库 |

MongoDB简介

MongoDB中的记录是一个文档,它是一个数据结构组成 字段和值对。MongoDB文档类似于JSON。 对象。字段的值可能包括其他文档、数组、 和文档数组。

使用文档的优点是:

  • 文档对应于许多编程中的本机数据类型 语言。
  • 嵌入式文档和数组减少了对昂贵联接的需求。
  • 动态架构支持流畅的多态性。

对比SQL

SQL概念MongoDB概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

MongoDB常用语句

数据库

命令描述示例
db.version()查看当前数据库版本
mongo.exe -u root -p 密码 --authenticationDatabase admin登录mongo.exe -u root -p 123 --authenticationDatabase admin
show dbs查询所有数据库
db显示当前数据库
use local切换指定数据库
db.stats()查看数据库当前状态
db.getMongo()查看当前数据库连接机器地址connection to 127.0.0.1

show dbs

  • admin 0.000GB
    • 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • config 0.000GB
    • 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • local 0.000GB
    • 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息

创建和删除数据库

命令描述示例说明
use 数据库名创建数据库
db.dropDatabase()删除当前数据库如果没有选择任何数据库,会删除默认的test数据库

集合

// 创建集合
    // 1. 直接创建
    db.createCollection('collection')
    	// 创建student集合
    	db.createCollection("student");

    // 2. 插入文档时自动创建
    db.collection.insert({name:'student'});
    	// 创建student集合

// 查看创建的合集
db.getCollectionNames()

// 查看集合里的内容
db.collection.find()

// 重命名集合
db.collection.renameCollection()

// 删除集合
db.合集名.drop()
	// 删除student集合
	db.student.drop()

// 删除集合中的记录数
db.log.distinct("name")

文档 增删改查

插入数据 insert()

// 模板
db.collection.insert(document)

// 插入空数据 并且直接创建集合
db.collection.insert({})

// 插入一个或多个数据
db.collection.insert({字段名1:"",字段名2:"",...})

// save 方法可以用来插入新数据也可以修改相同 _id 的数据
db.collection.save({name: '王五', age: 26})
db.collection.save({'_id': ObjectId("5de1f5264d0e7ea372eddf12"), name: '王五', age: 26})

删除数据 remove()

// 删除所有数据
db.collection.remove({})

// 删除
db.collection.remove({age:22})

// remove 方法第二个参数为真,则只删除符合条件的数据中的第一条
db.collection.remove({age: 22}, 1)

修改数据 update()

// 模板
db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
// query : update的查询条件,类似sql update查询内where后面的。
// update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
// upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
// multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
// writeConcern :可选,抛出异常的级别。
	// 示例
    // $set修改器 默认只修改查到的第一条
    db.collection.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
    // $inc 可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作
    db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

原子操作常用命令

原子操作命令描述
$set用来指定一个键并更新键值,若键不存在并创建
$unset用来删除一个键
$inc$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作
$push可以追加一个值到一个数组字段内
$pushAll同$push,只是一次可以追加多个值到一个数组字段内
$pull从数组field内删除一个等于value值。
$pop删除数组的第一个或最后一个元素
$rename修改字段名称
$bit位操作,integer类型
偏移操作符

查询数据 find()

// 查询数据库表 / 集合的所有数据
db.getCollection("student").find();

// 查询指定字段数字类型
db.getCollection("student").find({"userId":632});

// 查询指定字段字符串类型
// 查询学号为 202045020144 的所有学生信息
db.getCollection("student").find({"No":"202045020144"});

// limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
db.collection.find().limit(NUMBER)

// skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数
db.collection.find().skip(NUMBER)

// sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列
db.collection.find().sort({KEY:1}) # 升序

操作符

操作符描述
$gt大于
$lt小于
$gte大于等于
$lte小于等于
$ne不等于
// 示例
// student集合中成绩大于等于100的数据
db.student.find({grade: { $gte:100 }})

// student集合中成绩小于100的数据
db.student.find({grade: { $lt:60 }})


操作符描述
$in包含某些数据
$nin不包含某些数据
$or或者
$mod取模
$not取反
null空查询
正则查询正则表达式
$exists$exists 存在字段,true 为存在字段 key 的数据,false 为不存在字段 key 的数据
$size$size是查询一定元素的数量且是数组的字段
$where可以使用js
limit()限制数量
skip()跳过数量

聚合

聚合操作处理数据记录并返回计算结果。可以使用聚合操作执行以下操作:

  • 将多个文档中的值组合在一起。
  • 对分组数据执行操作以返回单个结果。
  • 分析数据随时间的变化。

若要执行聚合操作,可以使用:

聚合管道 aggregate()

聚合操作这里不是使用find()方法了,而是 aggregate()方法。

// 1. $match 用于对数据进行筛选
{"$match":{"字段":"条件"}} // 可以使用任何常用查询操作符$gt,$lt,$in等
	// 示例
	// 查询出 name : "dave"的所有数据
	db.student.aggregate(
    [ { $match : { name : "dave" } } ]
    );

// 2. $project翻译为投射 ,即将一个数据结果映射为另一个结果 过程中可以对某些数据进行修改  控制其最终显示的结果
{"$project":{"要保留的字段名":1,"要去掉的字段名":0,"新增的字段名":"表达式"}}

// 3. $group分组,按指定的 _id 表达式对输入文档进行分组,并针对每个不同的分组输出文档
	// 示例
	{"$group":{"_id":"$sex"}} // 按照性别分组
    {"$group":{"_id":"$post"}} // 按照职位分组
    {"$group":{"_id":{"state":"$state","city":"$city"}}} // 按照多个字段分组,比如按照州市分组
    // 如果字段是排序后的,那么$first,$last会很有用,比用$max和$min效率高
db.emp.aggregate({"$group":{"_id":"$post","first_id":{"$first":"$_id"}}})
    // 求每个部门的总工资
    db.emp.aggregate({"$group":{"_id":"$post","count":{"$sum":"$salary"}}})
    // 求每个部门的人数
    db.emp.aggregate({"$group":{"_id":"$post","count":{"$sum":1}}})
    
// 4. $sort 
{"$sort":{"字段名":1,"字段名":-1}} // 1升序,-1降序


// 5. $sample 随机取出n条记录
	// 示例
	#下述操作时从users集合中随机选取3个文档
    db.users.aggregate({"$sample":{"size":3}})

累加器运算符

名称描述
$addToSetopen in new window返回每个组的唯一表达式值的数组。数组元素的顺序未定义。
$avgopen in new window返回数值的平均值。忽略非数字值。
$firstopen in new window从每个组的第一个文档返回一个值。仅当文档按定义的顺序定义顺序。
$lastopen in new window从每个组的最后一个文档返回一个值。仅当文档按定义的顺序定义顺序。
$maxopen in new window返回每个组的最高表达式值。
$mergeObjectsopen in new window返回通过组合每个组的输入文档而创建的文档。
$minopen in new window返回每个组的最低表达式值。
$pushopen in new window返回每个组的表达式值数组。
$stdDevPopopen in new window返回输入值的总体标准偏差。
$stdDevSampopen in new window返回输入值的样本标准偏差。
$sumopen in new window返回数值的总和。忽略非数字值。

MongoDB ObjectId

MongoDB 的对象 Id(ObjectId)。

ObjectId 是一个12字节 BSON 类型数据,有以下格式:

  • 前4个字节表示时间戳
  • 接下来的3个字节是机器标识码
  • 紧接的两个字节由进程id组成(PID)
  • 最后三个字节是随机数。

参考

(32条消息) mongodb查询大全mongo语句_逍遥客.的博客-CSDN博客_mongodb语句