zoukankan      html  css  js  c++  java
  • 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",不区分大小写

  • 相关阅读:
    [LeetCode] Implement Queue using Stacks
    [LintCode] 带重复元素的排列
    [LintCode] 全排列
    [LeetCode] Substring with Concatenation of All Words
    linux下安装eclipse并使用xstart远程使用(centos7)
    linux下安装jsp开发运行环境(centos7)
    linux下扩展root分区
    linux下安装telnet(centos7)
    linux下搭建java开发环境
    linux通过脚本获取内存信息
  • 原文地址:https://www.cnblogs.com/yjh1995/p/14164183.html
Copyright © 2011-2022 走看看