MongoDB

2022-05-13 20:04:44 浏览数 (1)

mongodb官方文档总结

  • MongoDB是非关系型数据库。
  • BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:
    • Basically Availble --基本可用
    • Soft-state --软状态/柔性事务。 "Soft state" 可以理解为"无连接"的, 而 "Hard state" 是"面向连接"的
    • Eventual Consistency --最终一致性 最终一致性, 也是是 ACID 的最终目的。

概念对照

SQL术语/概念

MongoDB术语/概念

解释/说明

database

database

数据库

table

collection

数据库表/集合

row

document

数据记录行/文档

column

field

数据字段/域

index

index

索引

table joins

表连接,MongoDB不支持

primary key

primary key

主键,MongoDB自动将_id字段设置为主键

这些定义看起来有点像是es中的定义。

  • 文档中的键值对是有序的。
  • 文档中的键是字符串。
  • 集合是mongoDb的 文档组,就像是table。但是没有固定的格式,任意格式和类型的数据都可以插入。
  • Capped collections 就是固定大小的collection。它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。

数据类型

数据类型

描述

String

字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。

Integer

整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。

Boolean

布尔值。用于存储布尔值(真/假)。

Double

双精度浮点值。用于存储浮点值。

Min/Max keys

将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。

Arrays

用于将数组或列表或多个值存储为一个键。

Timestamp

时间戳。记录文档修改或添加的具体时间。

Object

用于内嵌文档。

Null

用于创建空值。

Symbol

符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。

Date

日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。

Object ID

对象 ID。用于创建文档的 ID。

Binary Data

二进制数据。用于存储二进制数据。

Code

代码类型。用于在文档中存储 JavaScript 代码。

Regular expression

正则表达式类型。用于存储正则表达式。

  • 在一个集合里面,每个文档都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。考虑到多个服务器,所以并不是使用自增的方式。用newObjectId = ObjectId() 生成
  • MongoDB支持全文检索,(不过全文检索这方面还是es靠谱)
  • MongoDB支持正则表达式查询。
  • 固定集合插入速度,按照插入顺序查询极快,并且能自动删除老数据。

基本命令

代码语言:javascript复制
use DATABASE_NAME  

创建数据库,如果已有,进入该数据库进行操作

代码语言:javascript复制
db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})  

创建固定集合

代码语言:javascript复制
show dbs 

展示所有数据库,但是没有数据的数据库将不会展示

代码语言:javascript复制
db.dropDatabase()

删除当前数据库

代码语言:javascript复制
db.collection.drop() 

删除当前数据库的集合

代码语言:javascript复制
db.COLLECTION_NAME.insert(document)  
eg:db.col.insert({title: 'MongoDB 教程',
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'MongoDB中文网', 
    url: 'http://www.mongodb.org.cn', 
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100  
})
还可以将数据定义成变量之后插入数据:
document=({title: 'MongoDB 教程',
    description: 'MongoDB 是一个 Nosql 数据库', 
    by: 'Mongodb中文网',    
    url: 'http://www.mongodb.org.cn', 
    tags: ['mongodb', 'database', 'NoSQL'],  
    likes: 100  
});  
db.col.insert(document)

往一个集合里面添加数据。

代码语言:javascript复制
db.collection.update(    
    <query>, 
    <update>, 
    {       
        upsert: <boolean>,   
        multi: <boolean>,  
        writeConcern: <document>
    }
)
eg:db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 输出信息  

修改数据

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如,inc...)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别
代码语言:javascript复制
db.collection.save(    
    <document>,     
    {      
        writeConcern: <document> 
    }  
)  
eg:db.col.save({    
    "_id" : ObjectId("56064f89ade2f21f36b03136"),   
    "title" : "MongoDB",  
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "MongoDB中文网",   
    "url" : "http://www.mongodb.org.cn",     
    "tags" : [           
        "mongodb",       
        "NoSQL"    
    ],    
    "likes" : 110
    }
)//替换了_id 为 56064f89ade2f21f36b03136 的文档数据

传入的文档来替换已有的数据

代码语言:javascript复制
db.collection.remove(     
    <query>,     
    {       
        justOne: <boolean>,
        writeConcern: <document> 
    } 
) 
eg:db.col.remove({'title':'MongoDB 教程'}) 
db.col.remove({})  //删除所有数据

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档。
  • writeConcern :(可选)抛出异常的级别。
代码语言:javascript复制
db.COLLECTION_NAME.find()//全部
db.col.find().pretty()  // 易读方式
db.col.findOne()//只查一个

Where

操作

格式

范例

RDBMS中的类似语句

等于

{:}

db.col.find({"by":"菜鸟教程"}).pretty()

where by = '菜鸟教程'

小于

{:{$lt:}}

db.col.find({"likes":{$lt:50}}).pretty()

where likes < 50

小于或等于

{:{$lte:}}

db.col.find({"likes":{$lte:50}}).pretty()

where likes <= 50

大于

{:{$gt:}}

db.col.find({"likes":{$gt:50}}).pretty()

where likes > 50

大于或等于

{:{$gte:}}

db.col.find({"likes":{$gte:50}}).pretty()

where likes >= 50

不等于

{:{$ne:}}

db.col.find({"likes":{$ne:50}}).pretty()

where likes != 50

eg:db.col.find({likes : {

gt : 100}})

代码语言:javascript复制
db.col.find({key1:value1, key2:value2}).pretty()  

and查询

代码语言:javascript复制
db.col.find(     {        $or: [         {key1: value1}, {key2:value2}        ]     }  ).pretty() 
eg:db.col.find({"likes": {$gt:50}, $or: [{"by": "Mongodb中文网"},{"title": "MongoDB 教程"}]}).pretty() //and,or联合使用

or查询

Type

利用type可查询某一文档中的某一数据为特定的数据类型:

代码语言:javascript复制
db.col.find({"title" : {$type : 2}})

limit和skip

代码语言:javascript复制
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)  

查询前几条,跳过前几条,类似于limit ?,?

sort

代码语言:javascript复制
db.COLLECTION_NAME.find().sort({KEY:1})   
eg:db.col.find({},{"title":1,_id:0}).sort({"likes":-1})  //按照like倒序排序

使用 1 和 -1 来指定排序的方式

索引

MongoDB使用 ensureIndex() 方法来创建索引。

代码语言:javascript复制
db.COLLECTION_NAME.ensureIndex({KEY:1}) 
eg:db.col.ensureIndex({"title":1})//创建title升序索引
db.col.ensureIndex({"title":1,"description":-1})//复合索引
 db.values.ensureIndex({open: 1, close: 1}, {background: true})  //后台创建索引

可选参数:

Parameter

Type

Description

background

Boolean

建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。

unique

Boolean

建立的索引是否唯一。指定为true创建唯一索引。默认值为false.

name

string

索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。

dropDups

Boolean

在建立唯一索引时是否删除重复记录,指定 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.

索引是存储在内存中的,由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。

如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。

索引不能被以下的查询使用:

  • 正则表达式及非操作符,如

not, 等。

  • 算术运算符,如 $mod, 等。
  • $where 子句

所以,检测你的语句是否使用索引是一个好的习惯,可以用explain来查看。

0 人点赞