1. 程式人生 > 實用技巧 >MongoDB 文件操作

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})