MongoDB學習3 $操做符表達式大全及實例

from : http://blog.csdn.net/qq_16313365/article/details/58599253ajax

 

1.查詢和投影

 

1.1 比較操做符

$eq

語法:{ <field>: { $eq: <value> } }
釋義:匹配等於(=)指定值的文檔
舉例:
  1. 查詢age=20的文檔:  
  2. db.person.find( { age: { $eq: 20 } } )  
  3. 至關於:  
  4. db.person.find( { age: 20 } )  

$gt

語法:{<field>: {$gt: <value>} }
釋義:匹配大於(>)指定值的文檔

$gte

語法:{field: {$gte: value} }
釋義:匹配大於等於(>=)指定值的文檔

$lt

語法:{field: {$lt: value} }
釋義:匹配小於(<)指定值的文檔

$lte

語法:{ field: { $lte: value} }
釋義:匹配小於等於(<=)指定值的文檔

$ne

語法:{field: {$ne: value} }
釋義:匹配不等於(≠)指定值的文檔

$in

語法:{ field: { $in: [<value1>, <value2>, ... <valueN> ] } }
釋義:匹配數組中的任一值
舉例:
  1. 查詢該集合中字段qty的值與數組中的任意值相等的文檔:  
  2. db.inventory.find( { qty: { $in: [ 5, 15 ] } } )  

$nin

語法:{ field: { $nin: [ <value1>, <value2> ... <valueN> ]} }
釋義:不匹配數組中的值

1.2 邏輯操做符

$or

語法:{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
釋義:或 條件查詢
舉例:
  1. 查詢age<20或者address是beijing的文檔:  
  2. db.person.find( { $or: [ { age: { $lt: 20 } }, { address: "beijing" } ] } )  

$and

語法:{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
釋義:與 條件查詢

$not

語法:{ field: { $not: { <operator-expression> } } }
釋義:查詢與表達式不匹配的文檔
舉例:
  1. 查詢age不大於20的文檔:  
  2. db.person.find( { age: { $not: { $gt: 20 } } } )  

$nor

語法:{ $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }
釋義:查詢與任一表達式都不匹配的文檔
舉例:
  1. 查詢age既不等於20,sex也不是男的文檔:  
  2. db.person.find( { $nor: [ { age: 20 },{ sex: "男"} ] } )  

1.3 元素操做符

$exists

語法:{ field: { $exists: <boolean> } }
釋義:查詢存在指定字段的文檔
舉例:
  1. 查詢存在phone字段的文檔:  
  2. db.person.find( { phone: { $exists: true } } )  

$type

語法:{ field: { $type: <BSON type number> | <String alias> } }
釋義:查詢類型爲指定類型的文檔,3.2版本添加alias別名,各類類型的Number及Alias以下
舉例:
假設存在這樣一個集合:
  1. { "_id": 1, address: "2030 Martian Way",zipCode: "90698345"},  
  2. { "_id": 2, address: "156 Lunar Place",zipCode: 43339374},  
  3. { "_id": 3, address: "2324 Pluto Place",zipCode: NumberLong(3921412)},  
  4. { "_id": 4, address: "55 Saturn Ring", zipCode: NumberInt(88602117)}  
查詢該集合中zipCode字段的數據類型爲String類型的文檔:
  1. db.addressBook.find( { "zipCode" : { $type : 2 } } );  
  2. db.addressBook.find( { "zipCode" : { $type : "string" } } );  

1.4 評估操做符(Evaluation,不知道翻譯成什麼合適,暫且翻譯成這樣吧)

$mod

語法:{ field: { $mod: [ 除數, 餘數 ] } }
釋義:取餘條件查詢
舉例:
  1. 查詢age字段的值除以2餘0的文檔:  
  2. db.person.find( { age: { $mod: [ 2, 0 ] } } )  

$regex

語法:
{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }
釋義:正則表達式查詢
舉例:
  1. db.products.find( { sku: { $regex: /^ABC/i } } )  

$text

語法:
  1. {  
  2.     $text: {  
  3.         $search: <string>,  
  4.         $language: <string>,  
  5.         $caseSensitive: <boolean>,  
  6.         $diacriticSensitive: <boolean>  
  7.     }  
  8. }  
    • $search ——關鍵詞
    • $language ——語言,不支持中文!!!支持語言以下:點擊
    • $caseSensitive——是否區分大小寫,默認false
    • $diacriticSensitive——是否區分讀音,默認false
釋義:文本索引查詢
舉例:較爲複雜,請參考官網

$where

釋義:把一個含有JavaScript表達式的字符串或者是整個JavaScript函數轉換到查詢系統中,對內嵌文檔不起做用
舉例:
  1. db.myCollection.find( { $where: "this.credits == this.debits" } );  
  2. db.myCollection.find( { $where: function() { return obj.credits == obj.debits; } } );  

1.5 Geospatial Query Operators

請參考官網

1.6 數組操做符

$all

語法:{ < field >: { $ all : [ < value1 > , < value2 > ... ] } }
釋義:匹配文檔的數組字段中包含全部指定元素的文檔
舉例:
  1. 查詢articles集合中tags字段(是個數組)包含「ssl」和「security」的文檔(包含,但並非所有等於)  
  2. db.articles.find( { tags: { $all: [ [ "ssl", "security" ] ] } } )  

$elemMatch(query)

語法:{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
釋義:匹配內嵌文檔或數組中的部分field
舉例:
假設現有集合:
  1. { _id: 1, results: [ 82, 85, 88 ] }  
  2. { _id: 2, results: [ 75, 88, 89 ] }  
查詢results數組中含有區間[80,85)元素的文檔(結果爲第一條):
 
  1. db.scores.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } })  

$size

語法:{ field: { $size: <number> }
釋義:匹配數組長度爲指定大小的文檔
舉例:
  1. 查詢已經集齊了5張福卡的文檔:  
  2. db.person.find({card:{$size:5}})  

1.7 Bitwise Query Operators

請參考官網

1.8投影操做符

$(projection)

釋義:查詢數組中首個匹配條件的元素,至關於findOne()方法
舉例:
假設現有以下集合students:
  1. { "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] }  
  2. { "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] }  
  3. { "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] }  
  4. { "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] }  
  5. { "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] }  
  6. { "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] }  
查詢semester=1,而且grades中符合大於等於85的元素的第一個元素:
  1. db.students.find( { semester: 1, grades: { $gte: 85 } },{ "grades.$": 1 } )  
返回以下結果:
  1. { "_id" : 1, "grades" : [ 87 ] }{ "_id" : 2, "grades" : [ 90 ] }{ "_id" : 3, "grades" : [ 85 ] }  

$elemMatch(projection)

釋義:用於數組或內嵌文檔中的元素匹配(子元素匹配),只會返回匹配的第一個元素!!!
舉例:
假設現有以下集合:
  1. {  
  2.  _id: 1,  
  3.  zipcode: "63109",  
  4.  students: [  
  5.               { name: "john", school: 102, age: 10 },  
  6.               { name: "jess", school: 102, age: 11 },  
  7.               { name: "jeff", school: 108, age: 15 }  
  8.            ]  
  9. }  
  10. {  
  11.  _id: 2,  
  12.  zipcode: "63110",  
  13.  students: [  
  14.               { name: "ajax", school: 100, age: 7 },  
  15.               { name: "achilles", school: 100, age: 8 },  
  16.            ]  
  17. }  
  18. {  
  19.  _id: 3,  
  20.  zipcode: "63109",  
  21.  students: [  
  22.               { name: "ajax", school: 100, age: 7 },  
  23.               { name: "achilles", school: 100, age: 8 },  
  24.            ]  
  25. }  
查詢zipcode爲63109而且students數組中school=102的文檔:
 
  1. db.schools.find( { zipcode: "63109" },{ students: { $elemMatch: { school: 102 } } } )  
返回以下結果:
 
  1. { "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }{ "_id" : 3 }  

$meta

語法:{ $meta: <metaDataKeyword> }
釋義:請參考官網

$slice(projection)

釋義:在查詢中將數組進行切片(相似於分頁)
舉例:
  1. (1)查詢結果中,對於comments數組的元素只顯示前5個:  
  2. db.posts.find( {}, { comments: { $slice: 5 } } )  
  3. (2)查詢結果中,對於comments數組的元素只顯示後5個:  
  4. db.posts.find( {}, { comments: { $slice: -5 } } )  
  5. (3)查詢結果中,對於comments數組的元素跳過(skip)前20個,並只顯示(limit)10個元素(即21-30):  
  6. db.posts.find( {}, { comments: { $slice: [ 20, 10 ] } } )  
  7. (4)同理,跳事後20個,並顯示10個:  
  8. db.posts.find( {}, { comments: { $slice: [ -20, 10 ] } } )  

2.更新操做符

 

2.1 字段更新

$inc

語法:{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }
釋義:將文檔中的某個field對應的value自增/減某個數字amount
舉例:
  1. 將_id爲1的文檔的age字段在原來的基礎上+1:  
  2. db.person.update( { _id: 1 }, { $inc: { age: 1} })  

$mul

語法:{ $mul: { field: <number> } }
釋義:將文檔中的某個field對於的value作乘法操做
舉例:
  1. 將_id爲1的文檔的price值乘以1.25並更新:  
  2. db.products.update( { _id: 1 }, { $mul: { price: 1.25 } })  

$rename

語法:{$rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
釋義:重命名文檔中的指定字段的名
舉例:
  1. 將_id爲1的文檔的nickname字段重命名爲alias,cell字段重命名爲mobile  
  2. db.person.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } )  

$setOnInsert

語法:
db.collection.update( <query>, { $setOnInsert: { <field1>: <value1>, ... } }, { upsert: true })
釋義:配合upsert操做,在做爲insert時能夠爲新文檔擴展更多的field
舉例:
 
  1. 將_id爲1的文檔的item字段更改成apple,並插入新字段defaultQty,值爲100  
  2. db.products.update( { _id: 1 }, { $set: { item: "apple" }, $setOnInsert: { defaultQty: 100 } }, { upsert: true })  

$set

語法:{ $set: { <field1>: <value1>, ... } }
釋義:更新文檔中的某一個字段,而不是所有替換
舉例:
假設現有文檔:
  1. {_id:1,name:"zhangsan",sex:"男"}  
 
 
  1. 若是這樣寫:  
  2. db.person.update({_id:1},{sex:"女"});  
  3. 則更改以後的結果是醬的:  
  4. {_id:1,sex:"女"}  
  5. 若只想更改sex字段,能夠這樣寫:  
  6. db.person.update({_id:1},{$set:{sex:"女"}});  
 

$unset

語法:{ $unset: { <field1>: "", ... } }
釋義:刪除文檔中的指定字段,若字段不存在則不操做
舉例:
  1. 刪除_id爲1的文檔的name字段  
  2. db.person.update( { _id: 1}, { $unset: { name:"" } })  

$min

語法:{ $min: { <field1>: <value1>, ... } }
釋義:將文檔中的某字段與指定值做比較,若是原值小於指定值,則不更新;若大於指定值,則更新
舉例:
  1. 假設現有文檔:  
  2. { _id: 1, highScore: 800, lowScore: 200 }  
  3. 執行:db.scores.update( { _id: 1 }, { $min: { lowScore: 150 } } )  
  4. 執行結果:{ _id: 1, highScore: 800, lowScore: 150 }  

$max

語法:{ $max: { <field1>: <value1>, ... } }
釋義:與$min功能相反

$currentDate

語法:{ $currentDate: { <field1>: <typeSpecification1>, ... } }
釋義:設置指定字段爲當前時間
舉例:
  1. db.person.update( { _id: 1 }, { $currentDate: { "lastLogin": { $type: "timestamp" } } })  

2.2 數組更新

$(update)

語法:{ "<array>.$" : value }
釋義:請參考官網

$addToSet

語法:{ $ addToSet : { < field1 >: < value1 > , ... } }
釋義:用於添加一個元素到array中,通常用於update
舉例:
  1. 假設現有文檔:  
  2. { _id: 1, letters: ["a", "b"] }  
  3. 執行:db.test.update({_id:1},{$addToSet:{letters:"c"}})  
  4. 結果:{ "_id" : 1, "letters" : [ "a", "b", "c" ] }  
  5. 執行:db.test.update({_id:1},{$addToSet:{letters:["d","e"]}})  
  6. 結果:{ "_id" : 1, "letters" : [ "a", "b", "c", [ "d", "e" ] ] }  
  7. 注意,若想讓添加的多個元素分開成單個元素的效果,請參考$each的使用方法  

$pop

語法:{ $pop: { <field>: <-1 | 1>, ... } }
釋義:刪除數組中的第一個或最後一個元素,-1表示第一個,沒錯,第一個;1表示最後一個!
舉例:
 
  1. db.test.update({_id:1},{$pop:{letters:-1}});  

$pullAll

語法:{ $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } }
釋義:刪除數組或內嵌文檔字段中全部指定的元素
舉例:
  1. 假設現有文檔:{ _id: 1, scores: [ 0, 2, 5, 5, 1, 0 ] }  
  2. 執行:db.test.update( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } )  
  3. 結果:{ "_id" : 1, "scores" : [ 2, 1 ] }  

$pull

語法:{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
釋義:刪除知足條件的元素
舉例:
  1. 假設現有文檔:{ _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] }  
  2. 執行:db.test.update( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )  
  3. 結果:{ _id: 1, votes: [ 3, 5 ] }  
更多用法及實例,請參考官網

$pushAll

釋義:自v2.4開始,方法棄用,請使用$push和$each來配合實現

$push

語法:{ $push: { <field1>: <value1>, ... } }
釋義:往數組中追加指定的元素,若文檔中數組不存在,則建立並添加指定元素,自v2.4起,添加了對$.each的支持
舉例:
  1. db.students.update( { _id: 1 }, { $push: { scores: 89 } })  

$each

語法:
  1. { $addToSet: { <field>: { $each: [ <value1>, <value2> ... ] } } }  
  2. { $push: { <field>: { $each: [ <value1>, <value2> ... ] } } }  
釋義:須要搭配$addToSet或$push方可以使用

$sort

語法:
  1. {  
  2.   $push: {  
  3.      <field>: {  
  4.        $each: [ <value1>, <value2>, ... ],  
  5.        $sort: <sort specification>  
  6.      }  
  7.   }  
  8. }  
釋義:自v2.4加,配合$push使用,表示給文檔中的指定數組元素排序,1是升序,-1是降序
舉例:
  1. db.students.update(  
  2.    { _id: 1 },  
  3.    {  
  4.      $push: {  
  5.        quizzes: {  
  6.          $each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ],  
  7.          $sort: { score: 1 }  
  8.        }  
  9.      }  
  10.    }  
  11. )  

$position

語法:
  1. {  
  2.   $push: {  
  3.     <field>: {  
  4.        $each: [ <value1>, <value2>, ... ],  
  5.        $position: <num>  
  6.     }  
  7.   }  
  8. }  
釋義:自v2.6加,配合$push使用表示往數組元素中的指定位置插入元素
相關文章
相關標籤/搜索