04-集合操作

nobility 发布于 2022-11-28 2446 次阅读


集合操作

因为集合属于数据库的一个属性,所以以下的collection需要使用具体集合代替,并且集合是可以隐式创建的,若指定集合不存在会创建一个,而不会报错

添加操作

  • db.collection.insertOne(document,options):像集合中插入单个文档
    • document:要插入的文档
    • options:插入时的选项,可省
      • writeConcern:安全写级别文档
  • 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 本次操作删除文档的数量
此作者没有提供个人介绍
最后更新于 2022-11-28