MongoDB(1):数据库和集合基本操作
MongoDB是一款非关系型数据库。传统的关系型数据库受到各种关系的累赘,各种数据形式的束缚难以处理海量数据以及超高并发的业务场景。
而MongoDB又是一个非关系数据库中功能最丰富、最像关系数据库的。
MongoDB
MongoDB支持的数据结构是非常松散的,是类似json的bson格式。
{
title: 'MongoDB',
body: 'MongoDB是非关系型数据库',
}
MongoDB中一个数据库保护多个集合,一个集合包含多个文档,类似于MySQL中一个表包含多条数据。
集合级表,文档为一条记录。
基本概念
show dbs #查看所有数据库的列表
db # 查看当前数据库对象或者集合
use db_name # 切换数据库
文档
一个文档就是一行数据,MongoDb中使用一种json的bson存储数据,bson数据可以理解为在json的基础上添加了一些json中没有的数据类型。
文档之间的逻辑关系
#user
{
"name": "TOM",
"age": "10"
}
#address
{
"city":"BeiJing",
"building": "22A"
}
# 嵌入关系,一个文档嵌入到另外一个文档中
# address嵌入到user中
{
"name": "TOM",
"age": "10",
"address":{
"city":"BeiJing",
"building": "22A"
}
}
# 引用关系,通过引用文档_id来建立关系
{
"name": "TOM",
"age": "10",
"address_ids":[ObjectID("123456") ]
}
嵌入关系适用于一对一关系,引用式关系适用于一对多或多对多。
集合
即关系数据库中的表,可以包含多条结构不同的文档
{"user":"john", "age":"20"}
{"level": "Hard"}
缺点
同结构的数据要多次存储字段名,比如每条user文档都要存储字段名"name" 和 "age"
元数据
数据库的信息:DBNAME.system.*
DBNAME.system.namespaces :列出所有名字空间
DBNAME.system.indexs :列出所有索引
DBNAME.system.profile :列出数据库概要信息
DBNAME.system.users :列出访问数据库的用户
DBNAME.system.sources :列出服务器信息
数据库的创建和销毁
- 创建 use db_name
- 销毁 db.dropDatabase()
创建集合
db.createCollections("Collection_name")
show collections : 查看创建的集合
db.collecion_name.drop() : 删除集合
插入数据
- insert()
# 插入数据时,集合会自动创建
db.collection_name.insert([
{name:"tom", age:"20"},
{name:"john", age:"12"}
])
- save
# 插入数据时,集合会自动创建
db.collection_name.save([
{name:"tom", age:"20"},
{name:"john", age:"12"}
])
insert和save的区别
insert只能插入一条新的记录
save可以插入新的也可以更改某条记录
如果已经有了一条记录(以主键为准),insert 操作会报错,而使用 save 指令则会更新原记录。
查询
- find()
db.collections.find() # 不传递参数返回所有记录
db.collections.find().pretty() # 让输出结构更美观
- and
# 输入多个键值对实现and
db.collections.find({key1:val1, key2:val2})
- OR
# 使用$or关键字
db.collections.find( { $or:[{key1:val1}, {key2:val2}]})
- 同时使用AND和OR
db.collections.find({"key1": "val1",
$or:{
[
{key2:val2},{key3:val3}
]
}
- 数字比较
$gt,$eq,$gte,$lte
集合创建与删除
db.createCollection(name,options)
> db.createCollection("shiyanlou") #无参数
{ "ok" : 1 }
> show collections
shiyanlou
system.indexes
> db.createCollection("shiyanlou2", { capped : 1, autoIndexId : 1, size : 6142800, max : 10000 } ) #带参数
{ "ok ": 1 }
capped:类型为 Boolean,如果为 true 则创建一个固定大小的集合,当其条目达到最大时可以自动覆盖以前的条目。在设置其为 true 时也要指定参数大小;
autoIndexId:类型为 Boolean,默认为 false,如果设置为 true,则会在 _id 字段上自动创建索引,3.2后不再支持
size:如果 capped 为 true 则需要指定,指定参数的最大值,单位为 byte;
max:指定最大的文档数。
插入数据时先检查size再检查max
db.collection.drop()
更新
1.db.collection.update(
db.collection.update({"id":2}, {"id":5}) # id为2的数据将被更新为{id:5},其它字段被抛弃
db.collection.update({"id":2}, {$set:{age:20}}) # 只把age字段更新为20其它字段不变,如果没有这个字段则添加这个字段
db.collection.update({"id":3},{$set:{age:30}}, {"upsert":true}) #如果不存在该条数据则新增一条
# multi多行更新,multi要和$set组合使用
db.collections.update({"age":{$gt:20}}, {$set:{"salary":200}},{"multi":true})
- db.collection.save({_id:ObjectId(),NEW_DATA}) # 替换已存在记录
删除
db.COLLECTION_NAME.remove(DELECTION_CRITERIA)
createCollection():创建集合
db.COLLECTION.drop():删除集合
db.COLLECTION_NAME.insert(document):插入文档
db.COLLECTION_NAME.update(SELECTION_CRITERIA,UPDATED_DATA):更新文档
db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA}):替换已存在的文档
db.COLLECTION_NAME.remove(DELECTION_CRITERIA):删除文档