mongodb 資料操作CRUD
阿新 • • 發佈:2020-10-25
連結到mongo
新建超級使用者
上文中我們提到mongo使用者庫表管理。為了方便我們先新建一個root許可權的使用者。
db.createUser({user:'dbadmin',pwd:'123456', roles:[{role:'userAdminAnyDatabase', db:'admin'}]})
使用studio-3t連結到mongo
新建爬蟲庫
開啟連線後,在連線上右鍵,然後Add Database ->輸入資料庫名稱spider001
spider001在資料庫上面右鍵Manage Users -> Add 然後輸入使用者密碼,再授權。我們還能檢視該操作對應的程式碼。特別注意新建資料庫操作其實相當於use
dbname 的操作,不會真正新建資料庫,只有資料庫有使用者或者資料時,資料庫才回真實存在
use spider001 db.runCommand({ "createUser" : "spider001", "pwd" : "spideradmin", "customData" : { }, "roles" : [ { "role" : "read", "db" : "spider001" }, { "role" : "readWrite", "db" : "spider001" } ] });
CRUD操作
Create or insert
選擇spider001資料庫,可以用studio 3t開啟一個shell終端
#單條 db.user.insert({name:"refly",nikename:"haima",joy:["NBA","football","hiking"]})//不需要建表 #多條 db.user.insertMany([ { "name":"hailong",age:20,work:{location:"成都",name:"spider"} }, { "name":"rob", "birth":new Date("2020-10-23") } ])
插入後回自動生成一個_id欄位
Read operations
find方法基本應用
db.user.find({}) //查詢所有
db.user.find({name:"haima"}) //欄位匹配
db.user.find({"_id": ObjectId("5f9297276951ee42b7a44c24")}) //_id欄位
db.user.find({age:{$gt:10}}) //篩選age欄位大於10歲的
db.user.find({"work.name":"spider"}) //二級物件
db.user.find({"birth":{$gt:new Date("2010-10-23")}}) //日期處理
db.user.find({age:{$exists:false}} ) //查詢age字元不存在的 資料
//正則
db.user.find(
{ "name": { $regex: /^.*g$/ } }
)
//多條件
db.user.find( {
name:"hailong",
age:20
} )
db.user.find({joy:{$size:3}}) //查詢joy(陣列)欄位 長度為3的資料
關鍵詞
$in
陣列欄位中,有一個滿足就滿足查詢$all
陣列欄位中,包含所有給出的值 才滿足查詢$gt
greater than 篩選條件 中的 大於$lt
less than 篩選條件 中的 小於$lte
小於等於$gte
大於等於$exists
篩選欄位是否存在
db.bios.find( { contribs: { $all: [ "ALGOL", "Lisp" ] } } ) //contribs含其 `ALGOL`且包含`Lisp`
db.bios.find( { contribs: { $in: [ "ALGOL", "Lisp" ]} } ) //contribs含其中一個就可以
限制返回值欄位
db.user.find( { }, { name: 1 } ) //只返回name欄位和 _id欄位,_id會預設返回
db.user.find( { }, { name: 1, _id: 0} ) //只返回name欄位
db.user.find( { }, { name: true } ) //true,false也可以
//二級欄位,只返回work.location欄位,當然也會返回work
db.user.find({ },{ _id: 0,"work.location":1 } )
db.user.find({ },{ _id: 0,joy:{$slice:1} } ) //joy欄位(陣列)中只返回一個元素
常用方法 sort()
limit()
skip()
sort()排序
db.user.find({ }).sort( { age:-1, name: -1} ) //先按年齡排序,然後再按照名字排序
limit(n) 取前面n條
db.user.find( { } ).limit(10) //取10條
skip(n) 跳過前面幾條
db.user.find( { } ).skip(10) //忽略前10條
min()、max()
暫無解讀
count()
db.user.find( { } ).count() //統計查詢條數
itcount()
也是統計查詢條數,區別是itcount()是迭代器中剩餘的條數,而.count() 是查詢條數
db.user.find({ }).limit(10).count() //結果為11,表中為11條資料
db.user.find({ }).limit(10).itcount() //結果為10,迭代器中剩餘10條資料
size()
可以統計出skip()和limit()查詢過後的元素條數,這個更像itcount()
next()
迭代器返回下一個物件
db.user.find({ }).next()
explain()
查詢詳情
db.user.find({"work.name":"spider"}).explain() //感覺並沒什麼暖用
結果為
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "spider001.user",
"indexFilterSet" : false,
"parsedQuery" : {
"work.name" : {
"$eq" : "spider"
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"work.name" : {
"$eq" : "spider"
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "VM_0_8_centos",
"port" : 27017,
"version" : "3.6.20",
"gitVersion" : "39c200878284912f19553901a6fea4b31531a899"
},
"ok" : 1
}
forEach()
遍歷執行
db.user.find().forEach(function(el){print(el.name) })
map()
遍歷執行,每個執行結果都會返回,組成一個數組物件
db.user.find().map( function(u) { if(u.name!=null)return u.name; } )
Update Operations
updateOne() updateMany()方法
- updateOne()
db.collection.updateOne(
<filter>, //修改條件
<update>, //修改內容
{
upsert: <boolean>, //沒有的話就插入
writeConcern: <document>, //寫入策略,暫時不做解讀
collation: <document>, //Collation特性允許MongoDB的使用者根據不同的語言定製排序規則
arrayFilters: [ <filterdocument1>, ... ]
}
)
db.user.update({_id:ObjectId("5f9297276951ee42b7a44c24")},{$set:{name:"xxx"}})
//執行結果 WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.user.update({_id:-1 },{$set:{name:"-1id"}},{ upsert: true })
//執行結果 WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : -1 })
db.user.update({name:"rob"},{$set:{name:"hhhhh"}},{collation: {locale: "zh"}})
//collation 使用,還理解不太清楚
- arrayFilters用法
//資料為以下
db.students.insert([
{ "_id" : 1, "grades" : [ 95, 92, 90 ] },
{ "_id" : 2, "grades" : [ 98, 100, 102 ] },
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }
])
db.students.updateOne(
{ _id:2 },
{ $set: { "grades.$[element]" : 100 } },
{ arrayFilters: [ { "element": { $gte: 100 } } ] } //只更新grades欄位中大於100的數
)
執行後 _id為2資料的更新情況為只更新了grades 大於100的
{
"_id" : 2.0,
"grades" : [
98.0,
100.0,
100.0
]
}
- updateMany()
和updateOne()使用方式相同,只是updateMany可以更新多條資料
db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)
replaceOne()方法
使用方式和updateOne()一致,只是會替換整條資料
db.collection.replaceOne(
<filter>,
<replacement>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>
}
)
db.user.replaceOne({_id:-1},{_id:-1,nikename:"xxx",age:2}) //執行後,這條資料中再沒有name欄位了
Delete Operations
- deleteOne()、deleteMany()
db.collection.deleteOne(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
db.user.deleteOne({name:"hailong"}) //單條
db.user.deleteMany({name:"hailong"}) //滿足條件的都刪除