MongoDB學習(七)$操作符表示式大全及例項
阿新 • • 發佈:2018-12-24
寫在前面
本文基於官網v3.4的文件翻譯整理而來,包含了絕大多數常用的操作符,更多詳細的使用還請參考官網(戳這裡)。本人水平有限,若各位看官發現錯誤,還望及時留言指出,以免誤導!共同學習,共同進步!1.查詢和投影
1.1 比較操作符
$eq
語法:{ <field>: { $eq: <value> } } 釋義:匹配等於(=)指定值的文件 舉例:查詢age=20的文件: db.person.find( { age: { $eq: 20 } } ) 相當於: 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> ] } } 釋義:匹配陣列中的任一值 舉例:查詢該集合中欄位qty的值與陣列中的任意值相等的文件: db.inventory.find( { qty: { $in: [ 5, 15 ] } } )
$nin
語法:{ field: { $nin: [ <value1>, <value2> ... <valueN> ]} } 釋義:不匹配陣列中的值
1.2 邏輯操作符
$or
語法:{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] } 釋義:或 條件查詢 舉例:查詢age<20或者address是beijing的文件: db.person.find( { $or: [ { age: { $lt: 20 } }, { address: "beijing" } ] } )
$and
語法:{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] } 釋義:與 條件查詢
$not
語法:{ field: { $not: { <operator-expression> } } } 釋義:查詢與表示式不匹配的文件 舉例:查詢age不大於20的文件: db.person.find( { age: { $not: { $gt: 20 } } } )
$nor
語法:{ $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] } 釋義:查詢與任一表達式都不匹配的文件 舉例:查詢age既不等於20,sex也不是男的文件: db.person.find( { $nor: [ { age: 20 },{ sex: "男"} ] } )
1.3 元素操作符
$exists
語法:{ field: { $exists: <boolean> } } 釋義:查詢存在指定欄位的文件 舉例:查詢存在phone欄位的文件: db.person.find( { phone: { $exists: true } } )
$type
語法:{ field: { $type: <BSON type number> | <String alias> } } 釋義:查詢型別為指定型別的文件,3.2版本新增alias別名,各種型別的Number及Alias如下
舉例: 假設存在這樣一個集合:查詢該集合中zipCode欄位的資料型別為String型別的文件:{ "_id": 1, address: "2030 Martian Way",zipCode: "90698345"}, { "_id": 2, address: "156 Lunar Place",zipCode: 43339374}, { "_id": 3, address: "2324 Pluto Place",zipCode: NumberLong(3921412)}, { "_id": 4, address: "55 Saturn Ring", zipCode: NumberInt(88602117)}
db.addressBook.find( { "zipCode" : { $type : 2 } } ); db.addressBook.find( { "zipCode" : { $type : "string" } } );
1.4 評估操作符(Evaluation,不知道翻譯成什麼合適,暫且翻譯成這樣吧)
$mod
語法:{ field: { $mod: [ 除數, 餘數 ] } } 釋義:取餘條件查詢 舉例:查詢age欄位的值除以2餘0的文件: db.person.find( { age: { $mod: [ 2, 0 ] } } )
$regex
語法: { <field>: { $regex: /pattern/, $options: '<options>' } } { <field>: { $regex: 'pattern', $options: '<options>' } } { <field>: { $regex: /pattern/<options> } } 釋義:正則表示式查詢 舉例:db.products.find( { sku: { $regex: /^ABC/i } } )
$text
語法:{ $text: { $search: <string>, $language: <string>, $caseSensitive: <boolean>, $diacriticSensitive: <boolean> } }
- $search ——關鍵詞
- $language ——語言,不支援中文!!!支援語言如下:點選
- $caseSensitive——是否區分大小寫,預設false
- $diacriticSensitive——是否區分讀音,預設false
釋義:文字索引查詢 舉例:較為複雜,請參考官網
$where
釋義:把一個含有JavaScript表示式的字串或者是整個JavaScript函式轉換到查詢系統中,對內嵌文件不起作用 舉例:db.myCollection.find( { $where: "this.credits == this.debits" } ); db.myCollection.find( { $where: function() { return obj.credits == obj.debits; } } );
1.5 Geospatial Query Operators
請參考官網1.6 陣列操作符
$all
語法:{ < field >: { $ all : [ < value1 > , < value2 > ... ] } } 釋義:匹配文件的陣列欄位中包含所有指定元素的文件 舉例:查詢articles集合中tags欄位(是個陣列)包含“ssl”和“security”的文件(包含,但並不是全部等於) db.articles.find( { tags: { $all: [ [ "ssl", "security" ] ] } } )
$elemMatch(query)
語法:{ <field>: { $elemMatch: { <query1>, <query2>, ... } } } 釋義:匹配內嵌文件或陣列中的部分field 舉例: 假設現有集合:查詢results陣列中含有區間[80,85)元素的文件(結果為第一條):{ _id: 1, results: [ 82, 85, 88 ] } { _id: 2, results: [ 75, 88, 89 ] }
db.scores.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } })
$size
語法:{ field: { $size: <number> } 釋義:匹配陣列長度為指定大小的文件 舉例:查詢已經集齊了5張福卡的文件: db.person.find({card:{$size:5}})
1.7 Bitwise Query Operators
請參考官網1.8投影操作符
$(projection)
釋義:查詢陣列中首個匹配條件的元素,相當於findOne()方法 舉例: 假設現有如下集合students:查詢semester=1,並且grades中符合大於等於85的元素的第一個元素:{ "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] } { "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] } { "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] } { "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] } { "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] } { "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] }
返回如下結果:db.students.find( { semester: 1, grades: { $gte: 85 } },{ "grades.$": 1 } )
{ "_id" : 1, "grades" : [ 87 ] }{ "_id" : 2, "grades" : [ 90 ] }{ "_id" : 3, "grades" : [ 85 ] }
$elemMatch(projection)
釋義:用於陣列或內嵌文件中的元素匹配(子元素匹配),只會返回匹配的第一個元素!!! 舉例: 假設現有如下集合:查詢zipcode為63109並且students陣列中school=102的文件:{ _id: 1, zipcode: "63109", students: [ { name: "john", school: 102, age: 10 }, { name: "jess", school: 102, age: 11 }, { name: "jeff", school: 108, age: 15 } ] } { _id: 2, zipcode: "63110", students: [ { name: "ajax", school: 100, age: 7 }, { name: "achilles", school: 100, age: 8 }, ] } { _id: 3, zipcode: "63109", students: [ { name: "ajax", school: 100, age: 7 }, { name: "achilles", school: 100, age: 8 }, ] }
返回如下結果:db.schools.find( { zipcode: "63109" },{ students: { $elemMatch: { school: 102 } } } )
{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }{ "_id" : 3 }
$meta
語法:{ $meta: <metaDataKeyword> } 釋義:請參考官網
$slice(projection)
釋義:在查詢中將陣列進行切片(類似於分頁) 舉例:(1)查詢結果中,對於comments陣列的元素只顯示前5個: db.posts.find( {}, { comments: { $slice: 5 } } ) (2)查詢結果中,對於comments陣列的元素只顯示後5個: db.posts.find( {}, { comments: { $slice: -5 } } ) (3)查詢結果中,對於comments陣列的元素跳過(skip)前20個,並只顯示(limit)10個元素(即21-30): db.posts.find( {}, { comments: { $slice: [ 20, 10 ] } } ) (4)同理,跳過後20個,並顯示10個: db.posts.find( {}, { comments: { $slice: [ -20, 10 ] } } )
2.更新操作符
2.1 欄位更新
$inc
語法:{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } } 釋義:將文件中的某個field對應的value自增/減某個數字amount 舉例:將_id為1的文件的age欄位在原來的基礎上+1: db.person.update( { _id: 1 }, { $inc: { age: 1} })
$mul
語法:{ $mul: { field: <number> } } 釋義:將文件中的某個field對於的value做乘法操作 舉例:將_id為1的文件的price值乘以1.25並更新: db.products.update( { _id: 1 }, { $mul: { price: 1.25 } })
$rename
語法:{$rename: { <field1>: <newName1>, <field2>: <newName2>, ... } } 釋義:重新命名文件中的指定欄位的名 舉例:將_id為1的文件的nickname欄位重新命名為alias,cell欄位重新命名為mobile db.person.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } )
$setOnInsert
語法: db.collection.update( <query>, { $setOnInsert: { <field1>: <value1>, ... } }, { upsert: true }) 釋義:配合upsert操作,在作為insert時可以為新文件擴充套件更多的field 舉例:將_id為1的文件的item欄位更改為apple,並插入新欄位defaultQty,值為100 db.products.update( { _id: 1 }, { $set: { item: "apple" }, $setOnInsert: { defaultQty: 100 } }, { upsert: true })
$set
語法:{ $set: { <field1>: <value1>, ... } } 釋義:更新文件中的某一個欄位,而不是全部替換 舉例: 假設現有文件:{_id:1,name:"zhangsan",sex:"男"}
如果這樣寫: db.person.update({_id:1},{sex:"女"}); 則更改之後的結果是醬的: {_id:1,sex:"女"} 若只想更改sex欄位,可以這樣寫: db.person.update({_id:1},{$set:{sex:"女"}});
$unset
語法:{ $unset: { <field1>: "", ... } } 釋義:刪除文件中的指定欄位,若欄位不存在則不操作 舉例:刪除_id為1的文件的name欄位 db.person.update( { _id: 1}, { $unset: { name:"" } })
$min
語法:{ $min: { <field1>: <value1>, ... } } 釋義:將文件中的某欄位與指定值作比較,如果原值小於指定值,則不更新;若大於指定值,則更新 舉例:假設現有文件: { _id: 1, highScore: 800, lowScore: 200 } 執行:db.scores.update( { _id: 1 }, { $min: { lowScore: 150 } } ) 執行結果:{ _id: 1, highScore: 800, lowScore: 150 }
$max
語法:{ $max: { <field1>: <value1>, ... } } 釋義:與$min功能相反
$currentDate
語法:{ $currentDate: { <field1>: <typeSpecification1>, ... } } 釋義:設定指定欄位為當前時間 舉例:db.person.update( { _id: 1 }, { $currentDate: { "lastLogin": { $type: "timestamp" } } })
2.2 陣列更新
$(update)
語法:{ "<array>.$" : value } 釋義:請參考官網
$addToSet
語法:{ $ addToSet : { < field1 >: < value1 > , ... } } 釋義:用於新增一個元素到array中,一般用於update 舉例:假設現有文件: { _id: 1, letters: ["a", "b"] } 執行:db.test.update({_id:1},{$addToSet:{letters:"c"}}) 結果:{ "_id" : 1, "letters" : [ "a", "b", "c" ] } 執行:db.test.update({_id:1},{$addToSet:{letters:["d","e"]}}) 結果:{ "_id" : 1, "letters" : [ "a", "b", "c", [ "d", "e" ] ] } 注意,若想讓新增的多個元素分開成單個元素的效果,請參考$each的使用方法
$pop
語法:{ $pop: { <field>: <-1 | 1>, ... } } 釋義:刪除陣列中的第一個或最後一個元素,-1表示第一個,沒錯,第一個;1表示最後一個! 舉例:db.test.update({_id:1},{$pop:{letters:-1}});
$pullAll
語法:{ $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } } 釋義:刪除陣列或內嵌文件欄位中所有指定的元素 舉例:假設現有文件:{ _id: 1, scores: [ 0, 2, 5, 5, 1, 0 ] } 執行:db.test.update( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } ) 結果:{ "_id" : 1, "scores" : [ 2, 1 ] }
$pull
語法:{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } } 釋義:刪除滿足條件的元素 舉例:更多用法及例項,請參考官網假設現有文件:{ _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] } 執行:db.test.update( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } ) 結果:{ _id: 1, votes: [ 3, 5 ] }
$pushAll
釋義:自v2.4開始,方法棄用,請使用$push和$each來配合實現
$push
語法:{ $push: { <field1>: <value1>, ... } } 釋義:往陣列中追加指定的元素,若文件中陣列不存在,則建立並新增指定元素,自v2.4起,添加了對$.each的支援 舉例:db.students.update( { _id: 1 }, { $push: { scores: 89 } })
$each
語法:釋義:需要搭配$addToSet或$push方可使用{ $addToSet: { <field>: { $each: [ <value1>, <value2> ... ] } } } { $push: { <field>: { $each: [ <value1>, <value2> ... ] } } }
$sort
語法:釋義:自v2.4加,配合$push使用,表示給文件中的指定陣列元素排序,1是升序,-1是降序 舉例:{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $sort: <sort specification> } } }
db.students.update( { _id: 1 }, { $push: { quizzes: { $each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ], $sort: { score: 1 } } } } )
$position
語法:釋義:自v2.6加,配合$push使用表示往陣列元素中的指定位置插入元素{ $push: { <field>: { $each: [ <value1>, <value2>, ... ], $position: <num> } } }