• MongoDB学习3 $操作符表达式大全及实例


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

    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使用表示往数组元素中的指定位置插入元素
  • 相关阅读:
    数据结构之伸展树
    数据结构之后缀数组
    数据结构之Treap
    数据结构之AVL树
    数据结构之位图
    数据结构之红黑树
    数据结构之线段树
    数据结构之堆Heap
    关于安装软件的经验教训
    TCP建立连接通过三次握手,释放连接通过四次挥手
  • 原文地址:https://www.cnblogs.com/wihainan/p/7489406.html
Copyright © 2020-2023  润新知