首先構造一些數據
1 db.student.insert({ 2 name:'hunter', 3 courses:[{ name:'英語', classRoom:'1001'},{ name:'高等數學', classRoom:'1001'}] 4 })
1、新增操作,往courses新增一個課程
db.student.update({name:'hunter'},{ $addToSet: {courses:{ name:'復變函數', classRoom:'1002'} } })
重復執行一下以上指令,發現並沒有再新增一個課程,相同的數據只寫入一次。
那么要插入重復元素怎么處理,用關鍵字$push替代$addToSet,其他的不變,執行完后,可以發現,數據里有兩門一樣的復變函數課程。
db.student.update({name:'hunter'},{ $push: {courses:{ name:'復變函數', classRoom:'1002'} } })
2、刪除操作
下面來看看把復變函數這門課程進行刪除
使用$pull
db.student.update({name:'hunter'},{ $pull: {courses:{ name:'復變函數', classRoom:'1002'} } })
執行完之后,會發現,關於復變函數的兩條記錄均被刪除了,$pull會把匹配的數據全部刪除。
使用$pop操作符,該使用場景應該還是比較少的
db.student.update({name:'hunter'},{ $pop: {courses:1 } })
該操作會把在數組的最后一個元素進行刪除,如果把1修改成-1,那么刪除的數組的第一個元素。
3、修改操作
db.student.update({name:'hunter','courses.name':'英語'},{ $set: {'courses.$.classRoom':'1008'} })
$set操作符執行后,如果記錄匹配到多條,用$只進行了第一個元素的更改,需要多條修改那么用$[],如果指定下標修改,那么把$修改為元素的下標即可,索引從0開始,update修改也只是修改匹配的第一條記錄,如果要多條,使用updateMany()或者options設置為multi:true;
4、查詢
假設當前數據是這樣的。
{name:'hunter',courses:[{ name:'英語', classRoom:'1001'},{ name:'復變函數', classRoom:'1001'}]
{name:'tom',courses:[{ name:'英語', classRoom:'1001'},{ name:'復變函數', classRoom:'1002'}]
這個查詢全部的記錄都會查出來。
db.student.find({'courses.classRoom':'1001','courses.name':'復變函數'})
嚴格匹配查詢,這樣只有hunter的記錄能查詢出來。
//匹配出正確的文檔 db.student.find({'courses':{$elemMatch:{'classRoom':'1001','name':'復變函數'}}})
//這個是匹配出正確的文檔后,再篩選指定的數據,find的第二個參數是個project,雖然與查詢參數是一樣的,作用倒是不同。 db.student.find({'courses':{$elemMatch:{'classRoom':'1001','name':'復變函數'}}},{'courses':{$elemMatch:{'classRoom':'1001','name':'復變函數'}}})
