4

若尘_的个人空间

 3 years ago
source link: https://my.oschina.net/ruochenblog/blog/4955582
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

MongoDB

创建数据库

- 格式:use DATABASE_NAME
	- use ruochen
	- db

创建数据库需要插入一条数据才会在列表中显示 - db.ruochen.insert({'name': '若尘'}) - show dbs

删除数据库

  • 格式:db.dropDatabase()
    • use ruochen
    • db.dropDatabase()
    • show dbs
- 格式:db.createCollection(name, options)
- name: 要创建的集合名称
- options: 可选参数,指定有关内存大小及索引的选项
字段 类型 描述 capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。 autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 size 数值 (可选)为固定集合指定一个最大值,以千字节计(KB)。如果 capped 为 true,也需要指定该字段。 max 数值 (可选)指定固定集合中包含文档的最大数量。

在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段

实例
# 在test数据库中创建ruochen 集合
use test
db.createCollection('ruochen')
# 查看已有集合
show collections

db.createCollection('test', {capped: true, autoIndexId: true, size: 1024000, max: 10000})  # autoIndexId 已弃用,默认_id添加索引

# 插入文档时,MongoDB会自动创建集合
db.ruochen.insert({'name': 'ruochen'})
  • 格式:db.collection.drop()
    • use ruochen
    • db.createCollection('ruochen') # 创建集合
    • show tables
    • db.ruochen.drop()
    • show tables
  • 格式:db.COLLECTION_NAME.insert(document)
    • db.ruochen.insert({title: 'MongoDB 教程', description: 'shu ju ku', by: 'ruochen', tags: ['mongodb', 'database', 'NoSQL'] })
    • db.ruochen.find()
    • document=({title: 'mongodb', description: 'shu ju ku', by: 'ruochen', tags: ['mongodb', 'database', 'NoSQL'] })
    • db.ruochen.insert(document)
    • db.ruochen.find()
  • db.collection.insertOne() # 向指定集合中插入一条文档数据
  • db.collection.insertMany() # 向指定集合中插入多条文档数据
    • var document = db.ruochen.insertOne({"e": 3})
    • document
    • var res = db.ruochen.insertMany([{'a': 1}, {'b': 2}])
  • 一次插入多条数据
    • 先创建数组
    • 将数据放在数据中
    • 一次insert到集合中
    • 案例
      • var arr = [];
      • for(var i = 1; i < 5; i++){ arr.push({num:i});}
      • db.num.insert(arr);
格式
db.collection.update(
	<query>,
	<update>,
	{
		upsert: <boolean>,
		multi: <boolean>,
		writeConcern: <ducument>
	}
)

query: update的查询条件,类似sql update查询内where后面的
update: update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
multi: 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
writeConcern: 可选,抛出异常的级别

案例
db.ruochen.insert({
	title: 'mongodb',
	description: 'Nosql 数据库',
	by: 'ruochen',
	tags: ['mongodb', 'databases', 'NoSQL']
})

db.ruochen.update({'title': 'mongodb'}, {$set:{'title': 'MongoDB'}})  # 只会修改第一条发现的文档
db.ruochen.find().pretty()

db.ruochen.update({'title': 'mongodb'}, {$set:{'title': 'MongoDB'}}, {multi:true})  # 修改多条相同的文档


save() 方法: 通过传入的文档来替换已有文档
格式
db.collection.save(
	<document>,
	{
		writeConcern: <document>
	}
)
document: 文档数据
writeConcern: 可选,抛出异常的级别

案例
db.ruochen.save({
    "_id" : ObjectId("5e631a14c17b253e9cef40cc"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "Runoob",
    "url" : "http://www.runoob.com",
    "tags" : [
            "mongodb",
    ]
})
db.ruochen.find().pretty()
语法:
db.collection.remove(
	<query>,
	<justOne>
)

2.6版本以后语法格式
db.collection.remove(
	<query>
	{
		justOne: <boolean>,
		writeConcern: <document>
	}
)

参数说明
query: (可选) 删除的文档的条件
justOne: (可选) 如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档
writeConcern: (可选) 抛出异常的级别

db.ruochen.remove({'title': 'mongodb'})

# 只删除第一条找到的记录
db.COLLECTION_NAME.remove(DELETION_CRITHRIA, 1)

# 删除所有数据
db.ruochen.remove({})
db.ruochen.find()

# remove() 方法 并不会真正释放空间
# 需要执行db.repairDatabase() 来回收磁盘空间
db.repairDatabase()
db.runCommand({repairDatabase: 1})

remove方法已经过时
# 删除集合下所有文档
db.ruochen.deleteMany({})
# 删除 num 等于1 的全部文档
db.ruochen.deleteMany({num: '1'})
# 删除 num 等于1 的一个文档
db.ruochen.deleteOne({num: '1'})
语法:
db.collection.find(query, projection)
参数说明
query: 可选,使用查询操作符指定查询条件
projection: 可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)

# 以易读的方式读取数据
db.ruochen.find().pretty()
操作 格式 范例 RDBMS中的类似语句 等于 {key:value} db.ruochen.find({'by':'ruochen'}).pretty() where by = 'ruochen' 小于 {key:{$lt: value}} db.ruochen.find({'likes': {$lt:3}}).pretty() where likes < 3 小于或等于 {key:{$lte: value}} db.ruochen.find({'likes': {$lte:2}}).pretty() where likes <= 2 大于 {key:{$gt: value}} db.ruochen.find({'likes': {$gt:100}}).pretty() where likes > 100 大于等于 {key:{$gte: value}} db.ruochen.find({'likes': {$gte:200}}).pretty() where likes >= 200 不等于 {key:{$ne: value}} db.ruochen.find({'likes': {$ne:200}}).pretty() where likes != 200

AND条件

  • find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件

    • db.ruochen.find({key1: value1, key2: value2}).pretty()
    • db.ruochen.find({'by': 'ruochen', 'likes': 200}).pretty()

类似于 where by='ruochen' and likes=200

or条件

  •   db.ruochen.find(
      	{
      		$or:[
      			{key1: value1}, {key2: value2}
      		]
      	}
      ).pretty()
    
    • db.ruochen.find({$or:[{'likes': 2}, {'likes':200}]}).pretty()

AND和OR联合

  • db.ruochen.find({'likes': {$gt:100}, $or: [{'likes': 2}, {'likes': 200}]}).pretty()

条件操作符

db.ruochen.insert({
	title: 'python',
	description: 'i love python',
	by: 'ruochen',
	url: 'xxx',
	tags: ['python'],
	likes: 200
})

db.ruochen.insert({
	title: 'php',
	description: 'php是世界上最好的语言',
	by: 'ruochen',
	url: 'xxx',
	tags: ['php'],
	likes: 150
})

db.ruochen.insert({
	title: 'MondoDB',
	description: 'NoSQL数据库',
	by: 'ruochen',
	url: 'xxx',
	tags: ['mongodb'],
	likes: 100
})

# 获取 'ruochen' 集合中 'likes' 大于100的数据
db.ruochen.find({likes: {$gt: 100}}).pretty()
# 类似于SQL语句
Select * from ruochen where likes > 100;


获取 'ruochen' 集合中 'likes' 大于等于100的数据
db.ruochen.find({likes: {$gte: 100}}).pretty()
# 类似于SQL语句
Select * from ruochen where likes >= 100;


# 获取 'ruochen' 集合中 'likes' 小于150的数据
db.ruochen.find({likes: {$lt: 150}}).pretty()
# 类似于SQL语句
Select * from ruochen where likes < 150;


# 获取 'ruochen' 集合中 'likes' 小于等于150的数据
db.ruochen.find({likes: {$lte: 150}}).pretty()
# 类似于SQL语句
Select * from ruochen where likes <= 150;

MongoDB 使用 (<) 和 (>) 查询 - lt和lt 和 lt和gt

  • 获取"ruochen"集合中 "likes" 大于100,小于 200 的数据
    • db.ruochen.find({likes: {lt:200,lt: 200, lt:200,gt: 100}}).pretty()
    • 类似SQL语句
      • Select * from ruochen where likes > 100 and likes < 200;

模糊查询

  • 查询title中包含 'py' 的文档
    • db.ruochen.find({title:/py/}).pretty()
  • 查询title字段以 'p' 开头的文档
    • db.ruochen.find({title:/^p/}).pretty()
  • 查询title 字段以 'p' 结尾的文档
    • db.ruochen.find({title:/p$/}).pretty()

MongoDB $type 操作符

  • $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果
类型 数字 备注 Double 1   String 2   Object 3   Array 4   Binary data 5   Undedined 6 已废弃 Object id 7   Boolean 8   Date 9   Null 10   Regular Experssion 11   JavaScript 13   Symbol 14   JavaScript(with scope) 15   32-bit integer 16   Timestamp 17   64-bit integer 18   Min key 255 Query with -1 Max key 127  
  • 获取 "ruochen" 集合中 title 为 String 的数据
    • db.ruochen.find({'title': {$type: 2}}).pretty()
    • db.ruochen.find({'title': {$type: String}}).pretty()

Limit与Skip方法

Limit() 方法

  • 在MongoDB中读取指定数量的数据记录, 使用MongoDB的Limit方法
  • limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数
  • 语法
    • db.COLLECTION_NAME.find().limit(NUMBER)
  • 案例
    • db.ruochen.find().limit(2)

Skip() 方法

  • skip()方法跳过指定数量的数据
  • skip方法接受一个数字参数作为跳过的记录条数
  • 语法
    • db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
  • 案例
    • db.ruochen.find().limit(1).skip(1)

skip() 方法默认参数为0

MongoDB 排序

  • sort() 方法
    • sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列
    • 语法
      • db.COLLECTION_NAME.find().sort({key: 1})
    • 案例
      • ruochen 集合中的数据按字段 likes 的降序排列
      • db.ruochen.find().sort({'likes': -1}).pretty()

skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。

MongoDB 索引

  • creatIndex() 方法
    • MongoDB使用 createIndex() 方法来创建索引
    • 语法
      • db.collection.createIndex(keys, options)
      • Key 值为你要创建的索引字段, 1 为指定按升序创建索引, -1 为降序创建索引
    • 案例
      • db.ruochen.createIndex({'title': 1})
      • db.ruochen.createIndex({'title': 1, 'description': -1}) # 设置多个字段创建索引

createIndex() 接收可选参数,可选参数列表如下

Parameter Type Description background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称 dropDups Boolean 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间 v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本 weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重 default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language

MongoDB聚合

  • MongoDB聚合(aggregate)主要用于处理数据(诸如统级平均值、求和等), 并返回计算后的数据结果。有点类似sql语句中的count(*)

aggregate() 方法

  • 语法
    • db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
  • 实例
    • db.ruochen.aggregate([{$group: {_id: "$by", num_tutorial: {$sum: 1}}}])
    • 类似于mql语句
      • select by, count(*) from ruochen group by by

聚合表达式

表达式 描述 实例 $sum 计算总和 db.ruochen.aggregate([{$group: {_id: "$by", num_tutorial: {$sum: "$likes"}}}]) $avg 平均值 db.ruochen.aggregate([{$group: {_id: "$by", avg: {$avg: "$likes"}}}]) $min 获取集合中所有文档对应值的最小值 db.ruochen.aggregate([{$group: {_id: "$by", min: {$min: "$likes"}}}]) $max 获取集合中所有文档对应值的最大值 db.ruochen.aggregate([{$group: {_id: "$by", min: {$max: "$likes"}}}]) $push 在结果文档中插入值到一个数组中 db.ruochen.aggregate([{$group: {_id: "$by", url: {$push: "$url"}}}]) $addToSet 在结果文档中插入值到一个数组中,但不创建副本 db.ruochen.aggregate([{$group: {_id: "$by", url: {$addToSet: "$url"}}}]) $first 根据资源文档的排序获取第一个文档数据 db.ruochen.aggregate([{$group: {_id: "$by", url: {$first: "$url"}}}]) $last 根据资源文档的排序获取最后一个文档数据 db.ruochen.aggregate([{$group: {_id: "$by", url: {$last: "$url"}}}])
  • 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数
  • MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理
  • 管道操作是可以重复的
  • 表达式:处理文档并输出
    • 表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档
  • 常用操作
    • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档
    • match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作
    • $limit:用来限制MongoDB聚合管道返回的文档数
    • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档
    • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
    • $group:将集合中的文档分组,可用于统计结果
    • $sort:将输入文档排序后输出
    • $geoNear:输出接近某一地理位置的有序文档
  • $project

      db.ruochen.aggregate(
      	{ $project: {
      		title: 1,
      		by: 1,	
      	}}
      );
      只剩_id, title 和 by 三个字段,默认_id 字段被包含
    
      db.ruochen.aggregate(
      	{ $project: {
      		_id: 0
      		title: 2,
      		by: 1,	
      	}}
      );
      如此即可不包含_id, 非0可表示显示字段,负数也可以表示显示该字段
    
  • $match

      获取分数大于70或小于等于90的记录,然后把符合条件的记录送到下一阶段$group 管道操作符进行处理
      db.ruochen.aggregate([
      	{$match: {score: {$gt: 70, $lte: 90}}},
      	{$group: {_id: null, count: {$sum: 1}}}
      ])
    

当 match 条件和 group 同时存在时,顺序会影响检索结果,必须先写 match 在前面

  • $skip

      过滤前5个文档
      db.ruochen.aggregate(
      	{$skip: 5});
    

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK