Mongodb 库、集合 文档 管理

库管理

  • 显示所有数据库列表【空数据库不会显示,或者说空数据库已经被 mongoDB 回收了。】
show dbs
show databases
  • 切换数据库,如果数据库不存在则创建数据库。
use  <database>
  • 查看当前工作的数据库
db		// 是db.getName() 的简写
  • 删除当前数据库,如果数据库不存在,也会返回{"ok":1}
use demo;			// 先切换到该数据库,才能删除该数据库
db.dropDatabase()
  • 查看当前数据库状态
> db.stats()
{
    "db" : "mofang",
    "collections" : 0,
    "views" : 0,
    "objects" : 0,
    "avgObjSize" : 0,
    "dataSize" : 0,
    "storageSize" : 0,
    "numExtents" : 0,
    "indexes" : 0,
    "indexSize" : 0,
    "scaleFactor" : 1,
    "fileSize" : 0,
    "fsUsedSize" : 0,
    "fsTotalSize" : 0,
    "ok" : 1
}

在mongodb中,最重要的核心是文档,如果一个库或者一个库下的集合中的文档全部被删除,则这个库和这个集合就会被mongodb回收;

集合管理

创建集合

在mongodb中其实不需要转门创建集合,直接添加文档,mongodb也会自动生成集合的;

//name 为必填参数,options 为可选参数。capped 若设置值为 true,则 size 必须也一并设置 
db.createCollection (
    name=<集合名称>,
    options = {
    	capped: <boolean>,  // 创建固定集,固定集指限制固定数据大小的集合,当数据达到最大值会自动覆盖最早的文档内容
    	size: <bytes size>, // 指定固定集合存储的最大字节数,单位:字节数。
    	max: <collection_size> //指定固定集合中包含文档的最大数量,单位:字节数
});

//添加文档到不存在的集合中,mongodb 会自动创建集合,
db.<集合名称>.insert({"name": "python。入门", "price": 31.4})

> db.courses.insert({"name": "python。入门", "price": 31.4})
WriteResult({ "nInserted" : 1 })
> show tables;
courses

集合列表

show collections   // 或 show tables  或 db.getCollectionNames()

删除集合

db.集合.drop()

查看集合

db.getCollection('集合')
db.集合名称

查看集合创建信息

db.printCollectionStats()

文档管理

Mongodb 中文档 也叫 object/document.

数据类型

文档中的数据类型自动匹配格式;

Type 描述
ObjectID 用于存储文档的 ID,相当于主键,区分文档的唯一字段,mongoDB 中就是一个对象的返回值
String 字符串是最常用的数据类型,MongoDB 中的字符串必须是 UTF-8 编码
Integer 整数类型用于存储数值。整数可以是 32 位,也可以是 64 位,这取决于你的服务器。
Double 双精度类型用于存储浮点值,mongodbl 中没有 float 浮点数这个说法
Boolean 布尔类型用于存储布尔值(true/ false)
Arrays 将数组、列表或多个值存储到一个键
Timestamp 时间戳,用于记录文档何时被修改或创建。Date(), Timestamp(), ISODate()
Object 用于嵌入文档,相当于子属性是另一个 json 文档而已,这种方式就可以实现嵌套
Null 空值,相当于 python 的 None
Symbol 与字符串用法相同,常用于某些使用特殊符号的语言
Date 用于以 UNIX 时间格式存储当前日期或时间
Binary data 二进制数据,常用于保存文件的内容,往往是图片,数据本身
Code 用于将 JavaScript 代码存储到文档中
Regular expression 正则表达式

添加文档

文档的数据结构和 JSON 基本一样。所有存储在集合中的数据在内部存储的格式最终都是 BSON 格式。

BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

//添加文档
//1 方式 1:
db.集合名称.insert(<document>) // document 就是一个 json 格式的数据


//方式 2:
db.集合.insertOne(         //如果文档存在 id 主键为更新数据,否则就添加数据。
    <document>
)


//方式 3:
//一次性添加多个文档,多次给同一个集合建议使用 insertManyl 比 insertOne 效率更好 
db.集合.InsertMany([ 
     <document>, 
     <document>,
     ..
)]

操作

use mofang;

// 添加一条数据
db.user_list.insert({'name': 'laoli', 'age':33, 'sex':true, 'child': {'name'; 'xiaohuihui', 'age':3}});
// WriteResult({"nInserted": 1})

/*
// mongo 原则上内置了js解释引擎,所以支持js语法
> db.user_list.find()[0].id

> db.user_list.find()[0].name
> db.user_list.find()[0]._id
> db.user_list.find()[0].sex
> db.user_list.find()[0].age
> db.user_list.find()[0].child
> db.user_list.find().pretty()

> a = db.user_list.find().pretty()
> a.id
> a = db.user_list.findOne()
> a._id
> a.name
> a.sex
*/

// 添加一条数据
db.user_list.insertOne({'name': 'xiaozhang', 'age': 18, 'sex': true});


// 添加多条数据
document1 = {"name": "xiaolan", "age": 16} 
document2 = {"name": "xiaoguang", "age": 16}
db.user_list.insertMany([document1, document2]);


// 查询数据
db.user_list.find()

删除文档

// 方式一
db.集合名称.remove(
    	<query>,			// removed 的条件,一般写法:{"属性": {条件:值}}, 如果不填写条件,删除所有文档
    	{
    		justOne: <boolean>,			// 可选删除,是否只删除查询到的第一个文档,默认为false,删除所有
    		writeConcern: <document>		// 可选参数,抛出一场的级别
    	}
)

// 方式二 删除一条数据
db.集合名称.deleteOne(
    	<query>,			// removed 的条件,一般写法:{"属性": {条件:值}}, 如果不填写条件,删除所有文档
    	{
    		justOne: <boolean>,			// 可选删除,是否只删除查询到的第一个文档,默认为false,删除所有
    		writeConcern: <document>		// 可选参数,抛出一场的级别
    	}
)


// 方式三,删除多条数据
db.集合名称.deleteMany(
    	<query>,			// removed 的条件,一般写法:{"属性": {条件:值}}, 如果不填写条件,删除所有文档
    	{
    		justOne: <boolean>,			// 可选删除,是否只删除查询到的第一个文档,默认为false,删除所有
    		writeConcern: <document>		// 可选参数,抛出一场的级别
    	}
)

操作:

// 添加多条数据 测试
document1 = {"name": "xiaohei", "age": 16} 
document2 = {"name": "xiaobai", "age": 16}
db.user_list.insertMany([document1, document2]);

//删除满足条件的第一条数据
// 条件 {"age": {$eq: 16}} 相当于 age==16
db.user_list.remove({"age": {$eq: 16}}, {"justOne": true})  
//删除满足条件的所有数据,条件中 $eq 可以写,可以不写
db.user_1ist.remove({"age":16});		//等于可以省略不写,相当于 db.user_1ist.remove({"age": {$eq:16}});


// 删除多条
db.user_list.deleteMany({'age':16});

// 删除一条
db.user_list.deleteOne({'age':16});

显示排序

db.集合.find().sort({<key>:1})   // 升序,默认为生序;从小大大
db.集合.find().sort({<key>:-1})  // 降序

操作

db.user_list.find().sort({age:-1});
db.user_list.find().sort({age: -1, sex:1})

字段投影

显示字段

find() 方法默认将返回文档的所有数据,但是可以通过设置 find() 的第二个参数 projection,设置值查询部分数据。

语法:

// 获取一条
db.集合.findOne(
    	<query>,				// 查询条件
    	{
    			<key>: 0,		// 隐藏指定字段,例如:'_id':0,
    			<key>: 1,		// 显示指定字段,例如:"title":1,
    			....
    	}
)


// 获取多条
db.结合.find(
    	<query>,				// 查询条件
    	{
    			<key>:0,		// 隐藏指定字段,例如:"_id":0,
    			<key>:1, 		// 显示指定字段,例如:"title":1,
    			...
    	}
)

操作:

db.user_list.find({'mobile':{$regex:/^133\d{8}$/}}, {"_id":0, "name":0}).sort({"mobile":-1})

限制与偏移

limit 方法用于限制返回结果的数量

skip 方法用于设置返回结果的开始位置

语法:

db.集合.find(...).limit(结果数量).skip(跳过数量)

终端操作:

db.user_list.find({},{"_id": 0, "name": 1, "age": 1}).sort({"age": 1}).limit(5);
db.user_list.find({}, {"_id": 0, "name": 1, "age": 1}).sort({"age": 1}).limit(5).skip(5);

更新文档

// 更新数据
db.集合.update(
    	<query>,		// update 的查询条件,一般写法:{"属性": {条件: 值}}
    	<update>,		// update的对象,一般写法{ $set:{"属性": "值"}} 或者 { $inc:{"属性": "值"} }
    	{
    			upsert: <boolean>,			// 可选参数,可选参数,如果文档不存在,是否插入 objNew, true 为插入,默认是 false,不插入
    			multi: <boolean>, 			// 可选参数,是否把满足条件的所有数据全部更新,设置更新 1 条还是多条
    			writeConcern: <document>	//可选参数,抛出异常的级别。
    	
    	}
)


// 更新一条
db.集合.updateOne(
    	<query>,
    	<update>,
    	{
    			upsert: <boolean>,			// 可选参数,可选参数,如果文档不存在,是否插入 objNew, true 为插入,默认是 false,不插入
    			multi: <boolean>, 			// 可选参数,是否把满足条件的所有数据全部更新,设置更新 1 条还是多条
    			writeConcern: <document>	//可选参数,抛出异常的级别。
    	
    	}
)


// 更新多条
db.集合.updateMany(
    	<query>,		// update 的查询条件,一般写法:{"属性": {条件: 值}}
    	<update>,		// update的对象,一般写法{ $set:{"属性": "值"}} 或者 { $inc:{"属性": "值"} }
    	{
    			upsert: <boolean>,			// 可选参数,可选参数,如果文档不存在,是否插入 objNew, true 为插入,默认是 false,不插入
    			multi: <boolean>, 			// 可选参数,是否把满足条件的所有数据全部更新,设置更新 1 条还是多条
    			writeConcern: <document>	// 可选参数,抛出异常的级别。
    	
    	}
)