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>,引數說明:
-
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,將欄位的值設定為當前日期,可以是
Date
或timestamp
,預設型別是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})