MongoDB 文档操作

文档操作

插入文档

  • db.COLLECTION_NAME.insert(document),若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据

  • db.COLLECTION_NAME.insertOne(), 向集合插入一个新文档

    • db.collection.insertOne(
        <document>,
        {
           writeConcern: <document>
        }
      )
  • db.COLLECTION_NAME.insertMany(document...),向集合插入一个多个文档

    • db.collection.insertMany(
        [ <document 1> , <document 2>, ... ],
        {
           writeConcern: <document>,
           ordered: <boolean>
        }
      )

      参数说明:

      • document:要写入的文档。

      • writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。

      • ordered:指定是否按顺序写入,默认 true,按顺序写入。

  • db.collection.replaceOne()

插入数据案例:

# 直接插入一个json对象
db.col.insert({title: 'MongoDB 教程',
   description: 'MongoDB 是一个 Nosql 数据库',
   by: '菜鸟教程',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
});
# 先定义一个json对象,再插入
> document=({title: 'MongoDB 教程',
   description: 'MongoDB 是一个 Nosql 数据库',
   by: '菜鸟教程',
   url: 'http://www.runoob.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
});
db.col.insert(document)

ObjectId

插入一个文档,会自动生成一个"_id":ObjectId(...)作为主键,ObjectId 是一个12字节 BSON 类型数据,有以下格式:

  • 前4个字节表示时间戳

  • 接下来的3个字节是机器标识码

  • 紧接的两个字节由进程id组成(PID)

  • 最后三个字节是随机数。

由于 ObjectId 中存储了 4 个字节的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间

ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()

更新文档

  • db.COLLECTION_NAME.update(),更新已存在的文档

    • db.collection.update(
        <query>,
        <update>,
        {
          upsert: <boolean>,
          multi: <boolean>,
          writeConcern: <document>
        }
      )

      参数说明:

      • query : update的查询条件,类似sql update查询内where后面的。没有查询条件写为 {}

      • update : update的对象和一些更新的操作符(如$set...)等,也可以理解为sql update查询内set后面的,常用的更新操作符如下:

        • $set,指定一个键的值。如果这个键不存在,则创建它

        • $unset{$unset:{key:1}} 从文档中移除指定的键

        • $inc{$inc:{key:int}} 用来在已有键的值上进行加减,或者在键不存在时创建一个键。$inc就是专门来增加(和减少)数字的。"$inc"只能用于整数、长整数或双精度浮点数。要是用在其他类型的数据上就会导致操作失败

        • $rename{$rename:{"old":"new"}} 重命名字段名称,新的字段名称不能和文档中现有的字段名相同

        • $currentDate,将字段的值设置为当前日期,可以是Datetimestamp,默认类型是Date。如果设置的字段不存在,$currentDate会在文档中添加该字段。格式如:{$currentDate:{字段名:时间类型,...}}。时间类型可以是满足下面条件的任意一个:

          • 布尔值true表示将字段值设置为当前日期作为Date

          • {$type:"timestamp"}{$type:"date"},它明确指定了类型。操作符区分大小写,仅接受小写的"timestamp"或者小写的"date"

        • $min,更新文档中某个小于特点值的字段,$min:{num:10},如果大于10,那么值会变为10,如果小于10,则不会有变化。$max则相反

        • $push,用法:{$push:{field:value}},把value追加到field里。注:field只能是数组类型,如果field不存在,会自动插入一个数组类型。(值可重复)

          • 追加多个值,{$push:{$each:[v1,v2...]}}

          • 追加一个数组,{$push:[v1,v2...]}

        • $addToSet,用法:{$addToSet:{field:value}},加一个值到数组内,而且只有当这个值在数组中不存在时才增加。(值不重复),用法同$push

        • $pop,用于删除数组内的一个值,删除数组内第一个值:{$pop:{field:-1}},删除数组内最后一个值:{$pop:{field:1}}

        • $pull,用法:{$pull:{field:_value}},作用:从数组field内删除一个等于_value的值

      • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

      • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

      • writeConcern :可选,抛出异常的级别。

    # 把likes=100的所有文档中的title更新为 'mongodb123'
    db.hjy.update(
    {'likes':100},{$set:{'title':'mongodb123'}},{multi:true}
    )
  • db.COLLECTION_NAME.save(),通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入

    • db.collection.save(
        <document>,
        {
          writeConcern: <document>
        }
      )

      参数说明:

      • document : 文档数据。

      • writeConcern :可选,抛出异常的级别。

删除文档

  • db.collection.remove(),移除集合中的数据

    • db.collection.remove(
        <query>,
        {
          justOne: <boolean>,
          writeConcern: <document>
        }
      )
      # 删除所有
      db.collection.remove({})

      参数说明:

      • query :(可选)删除的文档的条件。

      • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。

      • writeConcern :(可选)抛出异常的级别。

查询文档

  • db.collection.find(),查询文档,返回一个数组

    • db.collection.find(query, projection)
      • query :可选,使用查询操作符指定查询条件

      • projection :可选,指定需要返回的键{"key":1},不显示则为0。查询时返回文档中所有键值,只需省略该参数即可(默认省略)

  • db.collection.find().pretty(),以易读的方式来读取数据,pretty() 方法以格式化的方式来显示所有文档。

  • db.collection.findOne(),返回一个文档

条件查询

  • 等于 {<key>:<value>}

  • 不等于 {<key>:{$ne:<value>}}

  • 大于 {<key>:{$gt:<value>}} ,大于等于 {<key>:{$gte:<value>}}

  • 小于 {<key>:{$lt:<value>}} ,小于等于 {<key>:{$lte:<value>}}

    • # 范围查询 x1<y<x2
      {<key>:{$lt:<v1>,$gt:<v2>}}
  • AND条件,find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。

    • db.collection.find(
        {key1:value1,key2:value2}
      )
  • OR条件

    • db.collection.find(
        {$or: [
              {key1: value1}, {key2:value2}
        ]}
      )
  • AND 和 OR 组合

    • db.collection.find(
      { k1: v1,
      $or: [
      {k2:v2},{k3,v3}
      ]}
      )

$type操作符

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。不同数据类型对应不同数字,常见的的有:

Double -1,String -2,Object -3,Array -4,Binary data -5,Object id -7,Boolean -8,Date -9,Null -10

如查找某个key为字符串类型

db.hjy.find({"key":{$type:'string'}})  
db.hjy.find({"key":{$type:2}})  

Limit和Skip

  • db.collection.find().limit(NUMBER),limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。

  • db.collection.find().limit(NUMBER).skip(NUMBER),跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

sort排序

  • db.collection.find().sort(),sort() 方法对数据进行排序,通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

    • db.collection.find().sort({key:1})

skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()

distinct去重

db.collection.distinct({key})

MongoDB正则表达式(模糊查询)

MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。

db.posts.find({key:{$regex:"xxx",$options:"$i"}}})
  • key,需要查找的key

  • $regex:"xxx",xxx是正则表达式

  • $options:"$i",不区分大小写

 

posted @ 2020-12-20 17:15  huiyii  阅读(124)  评论(0编辑  收藏  举报