集合操作
因为集合属于数据库的一个属性,所以以下的collection
需要使用具体集合代替,并且集合是可以隐式创建的,若指定集合不存在会创建一个,而不会报错
添加操作
db.collection.insertOne(document,options)
:像集合中插入单个文档
document
:要插入的文档
options
:插入时的选项,可省
db.collection.insertMany(documentArray,options)
:像集合中插入多个文档
documentArray
:要插入的文档数组
options
:插入时的选项,可省
ordered
:是否顺序写入多个文档,默认为true,若按顺序写入时一旦遇到错误就会退出,后续文档不会写入,若乱序写入时遇到错误不会退出,后续正确文档会被正常写入
writeConcern
:安全写级别文档
db.collection.insert(documentORdocumentArray,options)
:像集合中插入单个或多个文档
documentORdocumentArray
:要插入的文档或文档数组
options
:插入时的选项,可省
ordered
:是否顺序写入多个文档,默认为true
writeConcern
:安全写级别文档
db.cllection.save(document)
:若文档主键已经存在,则是覆盖更新,若文档主键不存在则是插入
查询操作
db.collection.find(queryDocument,projection)
:在集合中查询出指定的文档,该方法返回的是一个游标
queryDocument
:查询文档,可省,省略后则是全查询
projection
:投影文档,可省,省略后则是全投影
查询文档
- 对于内嵌文档(数组是特殊的内嵌文档)查询时可以使用点运算符,但是必须使用双引号包裹
- 查询操作时,若字段是数组,则会对数组内元素进行匹配
- 对于没有该查询字段的,则值默认都是null
operator
为条件对象,该对象可以包含多个操作符,形式是{$operator:value,...}
比较操作符
操作符 |
描述 |
field:{$eq:value} 或field:{value} |
等于 |
field:{$gt:value} |
大于 |
field:{$gte:value} |
大于等于 |
field:{$lt:value} |
小于 |
field:{$lte:value} |
小于等于 |
field:{$ne:value} |
不等于 |
field:{$in:valueArray} |
包含 |
field:{$nin:valueArray} |
不包含 |
逻辑操作符
操作符 |
描述 |
field:{$not:operator} |
非 |
field:{$and:operatorArray} 或field:{operator,...} |
与 |
field:{$or:operatorArray} |
或 |
field:{$nor:operatorArray} |
或非(同时不成立) |
元查询操作符
操作符 |
描述 |
field:{$exists:boolean} |
属性是否存在 |
field:{$type:BSONtype} 或field:{$type:BSONtypeArray} |
属性是否是某个数据类型,数据类型需要加双引号 |
数组操作符
操作符 |
描述 |
arrayField:{$all:valueArray}
arrayField:{$all:operatorArray} |
数组包含所有指定元素,或数组中元素满足所有条件 |
arrayField:{$elemMatch:operatorObject} |
数组中元素满足至少一个条件 |
arrayField:{$size:intValue} |
数组包含元素的个数 |
评估操作符
操作符 |
描述 |
field:{$regex:/pattern/,$options:optionsString}}
field:{$regex:/pattern/optionsString} |
正则匹配,正则操作符在数组中必须使用第二种正则表达式对象方式 |
field:{$expr:expression} |
在查询中使用聚合表达式 |
投影文档
- 字段值为1时代表返回该字段,字段值为0时待变不返回该字段
- 默认情况下,文档主键总会返回,可以强制指定主键字段不返回,即在投影文档中加入
_id:0
- 除文档主键外,不能在投影文档中混用包含和不包含的投影操作的
- 对于是数组类型的字段的属性可以使用以下操作符
操作符 |
描述 |
arrayField:{$slice:indexORarray} |
值为整数时代表从索引位置开始裁剪到结尾(负整数代表倒数);当是数组时,代表裁剪范围[start,numner] ,从start开始的number个元素 |
arrayField:{$elemMatch:operatorObject} |
投影数组中满足该条件的第一个元素 |
"arrayField.$":flag |
使用查询文档中该参数的筛选条件,筛选出数组的第一个元素,进行投影操作 |
游标
- 游标默认只返回20条结果,若超过20条Mongo Shell会提示
Type "it" for more
输入it
命令向下遍历
- 返回的游标还可以存储在一个JavaScript变量中,使用数组的访问方式可以访问到游标中的元素
- 遍历完游标后游标会关闭,若未遍历完游标则十分钟后游标也会自动关闭
skip()
、limit()
、sort()
可以链式调用,但是执行顺序与书写顺序无关,永远都是按照sort()
、skip()
、limit()
顺序执行
方法名 |
描述 |
cursor.pretty() |
游标输出内容更加好看些 |
cursor.hasNext() |
判定游标后是否还有元素 |
cursor.next() |
返回当前指针的下一个元素,并且指针后移 |
cursor.forEach(callback) |
对游标内的所有元素执行该回调函数,回调函数的第一个参数就是游标元素 |
cursor.limit(number) |
返回指定前number 个元素,若number 是0则该方法失效 |
cursor.skip(number) |
返回指定跳过number 个之后的元素 |
cursor.sort(docment) |
返回排序后的结果,docment 指定排序字段,正一代表正向排序,负一代表逆向排序 |
cursor.count(flag) |
若flag 为false则返回游标中有多少个元素,若flag 为true则返回使用limit() 和skip() 方法后的个数 |
修改操作
db.collection.update(queryDocument,updateDocument,options)
:在集合中查询出指定的文档后进行修改
queryDocument
:查询文档,提供筛选条件
updateDocument
:更新文档,提供更新动作
options
:更新操作时的选项对象
multi
:若设为true则全部符合条件的文档,默认false;这样设置的原因是,MongoDB只能保证更新单个文档的原子性,虽然多个文档的更新操作是在单个线程中执行,但是这个线程执行时可能会被挂起。其他线程也有机会对数据进行操作,若非要保证多个文档操作时的原子性,就需要使用事务
db.cllection.save(document)
:若文档主键已经存在,则是覆盖更新,若文档主键不存在则是插入
更新文档
- 若更新文档中没有使用任何操作符,则会使用该文档替换原来文档
- 文档主键是不可更改的
- 对于内嵌文档(数组是特殊的内嵌文档)更新操作时可以使用点运算符,但是必须使用双引号包裹
- 对于数组来说,被当作内嵌文档,使用字段操作符
$set
和$unset
更新时可能出现空值跳号问题
字段更新操作符
操作符 |
描述 |
$set:{field:value,...} |
更新或添加新字段 |
$unset:{field:"",...} |
删除字段,即使不是空字符串,写任何内容也是删除,不影响 |
$rename:{field:newName,...} |
字段重命名,命名冲突时会覆盖就字段名的内容,所以可以实现与内嵌文档中字段提取和放置操作,但是不包括数组 |
$inc:{field:number,...} |
加减字段值,若字段不存在则当0来处理,若字段是非数字会报错 |
$mul:{field:number,...} |
相乘字段值,若字段不存在则当0来处理,若字段是非数字会报错 |
$min:{field:value,...} |
比较减少字段值,若当前字段值更小才更新,若字段不存在则会创建并更新 |
$max:{field:value,...} |
比较增大字段值,若当前字段值更大才更新,荣字段不存在则会创建并更新 |
数组更新操作符
操作符 |
描述 |
$pop:{arrayField:number,...} |
从数组弹出元素,正一从尾部弹出,负一从头部弹出,当删除完整个数组元素时,空数组会被保留,并不会删除掉空数组 |
$pull:{arrayField:valueORoperator,...} |
从数组中更具条件移除元素,可以指定元素做等值匹配,也可以指定条件对象删除;对于删除内嵌文档时,若字段顺序不同会移除,若部分匹配也会移除 |
$pullAll:{arrayField:valueArray,...} |
从数组中更具条件移除元素,只能以数组形式指定一个或多个元素做等值匹配 |
$addToSet:{arrayField:value,...} |
以集合方式向数组中添加元素,不会添加重复元素,若指定数组不存在会隐式创建 |
$push:{arrayField:value,...} |
向数组末尾添加元素,若指定数组不存在会隐式创建 |
{$each:array} |
与$push 和$addToSet 配合使用,作为value对象中的属性;拆分待插入数组,单个逐个插入到要添加的数组中 |
{$position:index} |
与$push 配合使用,作为value对象中的属性,并且该value对象必须还需要有$each 操作符;指定添加到数组的位置(在指定index索引之前插入,负索引代表倒数) |
{$slice:indexORarray} |
与$push 配合使用,作为value对象中的属性,并且该value对象必须还需要有$each 操作符 插入后再对数组进行裁剪,值为整数时代表从索引位置开始裁剪到结尾(负整数代表倒数);当是数组时,代表取值范围[start,numner] ,从start开始的number个元素 |
$sort:numberORdocment |
与$push 配合使用,作为value对象中的属性,并且该value对象必须还需要有$each 操作符 插入后再对数组进行排序,正一代表正向排序,负一代表逆向排序;若数组内都是内嵌文档,则可以指定一个文档对象来指定文档排序规则 |
"arrayField.$":value |
使用查询文档中该参数的筛选条件,筛选出数组的第一个元素,进行更新操作 |
"arrayField.$[]":value |
指定该数组中的所有元素,进行更新操作 |
删除操作
db.collection.remove(queryDocument,options)
:在集合中查询出指定的文档,该方法返回的是一个游标
queryDocument
:查询文档,提供筛选条件
options
:删除操作时的选项对象
justOne
:若设为true则删除一条符合筛选条件的文档,默认false
db.collection.drop()
:删除整个集合
返回结果文档
属性名 |
描述 |
insertedId |
插入文档的_id 主键 |
insertedIds |
插入多个文档时,所有文档的_id 主键,以数组形式存储 |
acknowledged |
是否开启了安全写级别 |
nInserted |
本次操作插入文档的数量 |
nUpserted |
本次操作更新文档的数量 |
nMatched |
本次操作匹配文档的数量 |
nModified |
本次操作修改文档的数量 |
nRemoved |
本次操作删除文档的数量 |
Comments NOTHING