mongodb 數據操作CRUD

鏈接到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"})    //滿足條件的都刪除