如果各位看过我之前的mongo博客,大家就会发现$是非常强大的。本篇博客中我们就专门来介绍一些常用的$操作符。
查询类
关键字 | 解释 | 语法 | 例子 |
---|---|---|---|
$eq | 值相等 | {field:{$eq:value}} | db.test.find({name:{$eq:“tom”}}) |
$gt | 大于 | {field:{$gt:value}} | db.test.find({age:{$gt:13}}) |
$gte | 大于等于 | {field:{$gte:value}} | db.test.find({age:{$gte:13}}) |
$lt | 小于 | {field:{$lt:value}} | db.test.find({age:{$lt:14}}) |
$lte | 小于等于 | {field:{$lte:value}} | db.test.find({age:{$lte:14}}) |
$ne | 不等于 | field:{$ne:value}} | db.test.find({age:{$ne:10}}) |
$in | 目标值在指定数组里面 | {field:{$in:[value1,…,valueN]}} | db.test.find({age:{$in:[12,20]}}) |
$nin | 目标值不在指定数组里面 | {field:{$nin:[value1,…,valueN]}} | db.test.find({age:{$nin:[12,20]}}) |
逻辑操作类
关键字 | 解释 | 语法 | 例子 |
---|---|---|---|
$or | 逻辑或 | {$or:[{expression1},…,{expressionN}]} | db.test.find({$or:[{name:“tom”},{name:“jim”}]}) |
$and | 逻辑与 | {$and:[{expression1},…,{expressionN}]} | db.test.find({$and:[{name:“tom”},{age:13}]}) |
$not | 与表达式不匹配的值(逻辑非) | {field:{$not:{expression}}} | db.test.find({name:{$not:{$eq:“tom”}}}) |
$nor | 与任意表达式(多个)都不匹配的值 | {$nor:[{expression1},…,{expressionN}]} | db.test.find({$nor:[{name:“tom”},{age:13}]}) |
属性操作类
关键字 | 解释 | 语法 | 例子 |
---|---|---|---|
$exists | 查询文档中是否存在指定属性的文档 | {field:{$exists:boolean} | db.test.find({y:{$exists:true}}) |
$type | 查询指定属性为某一类型的文档 | {field:{$type:typeNumber}}或者{field:{$type:alias}} | db.test.find({“x”:{KaTeX parse error: Expected 'EOF', got '}' at position 7: type:1}̲})或者db.test.fin…type:“number”}}) |
数组操作类
关键字 | 解释 | 语法 | 例子 |
---|---|---|---|
$all | 查询出文档的数组属性包含指定数组的文档 | {field:{$all:[value1,…,valueN]}} | db.test.find({“favorite.fruit”:{$all:[“apple”]}}) |
$elemMatch | 查询出目标数组有一个元素满足所有查询条件的文档 | {field:{$elemMatch:{query1,…,queryN}}} | db.test.find({“favorite.fruit”:{KaTeX parse error: Expected '}', got 'EOF' at end of input: elemMatch:{ne:“pear”,$ne:“apple”}}}) |
$size | 匹配数组长度为指定大小的文档 | {field:{$size:number}} | db.test.find({“favorite.fruit”:{$size:2}}) |
投影类(影响返回结果的属性)
关键字 | 解释 | 语法 | 例子 |
---|---|---|---|
field.$ | 在查询简单数组时,返回数组中匹配到的第一个元素 | {“field.$”:不为0或者false} | db.test.find({“favorite.fruit”:{$eq:“apple”}},{“favorite.fruit.$”:1}) |
$elemMatch | 在查询复杂数组时(数组里面是bson对象),返回数组里面匹配到的第一个bson | {field:{$elemMatch:{针对数组bson结构的查询条件}}} | db.test.find({class:“1”},{students:{$elemMatch:{age:12}}}) |
$slice | 切片(分页) | {field:{$slice:number}} number为正数则返回前n个,number为负数则返回后n个;{field:{$slice:[skipNum,limitNum]}} 表示跳过skipNum的数量,返回limitNum的元素 | db.test.find({class:“1”},{students:{$slice:2}}) |
修改属性值类
关键字 | 解释 | 语法 | 例子 |
---|---|---|---|
$inc | 对目标属性做加减法 | {$inc:{field1:num1,…,fieldN:numN}} | db.test.update({z:1},{$inc:{x:1,y:1}}) |
$mul | 对目标属性做乘法 | {$mul:{field1:num1,…,fieldN:numN}} | db.test.update({z:1},{$mul:{x:2,y:2}}) |
$mod | 取余 | {field:{$mod:[除数,余数]}} | db.test.find({x:{$mod:[2,1]}}) |
$rename | 将目标属性修改属性名 | {$rename:{field1:newName1,…,fieldN:newNameN}} | db.test.update({z:1},{$rename:{x:“a”,y:“b”}}) |
$set | 更改某一个属性的值,而不是全部替换 | {$set:{field1:num1,…,fieldN:numN}} | db.test.update({z:1},{$set:{a:1,b:1}}) |
$unset | 删除文档中的某一个字段,若不存在则不操作 | {$unset:{field1:anyValue,…,fieldN:anyValue}} | db.test.update({z:1},{$unset:{“c”:“2”}}) |
$min | 将文档中的值与输入的值比较,更新成较小的值 | {$min:{field1:value1,…,fieldN:valueN}} | db.test.update({z:1},{$min:{a:0,b:2}}) |
$max | 将文档中的值与输入的值比较,更新成较大的值 | {$max:{field1:value1,…,fieldN:valueN}} | db.test.update({z:1},{$max:{a:0,b:2}}) |
$currentDate | 将某一个属性设置成当前时间 | {KaTeX parse error: Expected '}', got 'EOF' at end of input: …tDate:{field1:{type1:typeValue1},…,fieldN:{$typeN:typeValueN}}} | db.test.update({z:1},{$currentDate:{b:{$type:“timedtamp”}}}) |
$addToSet | 添加一个元素到数组中(若数组中已存在则不添加) | {$addToSet:{field1:value1,…,fieldN:valueN}} | db.test.update({“z”:1},{$addToSet:{c:4}}) |
$pop | 删除数组中的第一个或者最后一个值,-1表示第一个,1表示最后一个 | {$pop:{field:-1或者1}} | db.test.update({z:1},{$pop:{c:-1}}) |
$pullAll | 删除数组中所有跟指定值相同的元素 | {$pullAll:{field:[value1,…,valueN]}} | db.test.update({z:1},{$pullAll:{c:[1,2]}}) |
$pull | 删除满足条件的所有元素 | {$pull:{field:value}} | db.test.update({z:1},{$pull:{c:{$eq:3},c:3}}) |
$push | 向数组中添加元素(可以重复添加) | {$push:{field:value}} | db.test.update({z:1},{$push:{c:1}}) |
$each | 搭配addToSet使用,如果要批量添加值,则可以通过添加数组的方式。$each会把要添加的数组一个一个拿出来添加到原数组中,不会把整个数组添加到原数组中 | {KaTeX parse error: Expected '}', got 'EOF' at end of input: push:{field:{each:[value1,value2]}}} | db.test.update({z:1},{KaTeX parse error: Expected '}', got 'EOF' at end of input: push:{c:{each:[1,2,3]}}}) |
复杂类
关键字 | 解释 | 语法 | 例子 |
---|---|---|---|
$regex | 使用正则表达式查询 | 很复杂 建议参考官网 | 很复杂 建议参考官网 |
$text | 文本索引查询 | 很复杂 建议参考官网 | 很复杂 建议参考官网 |
$where | 把js表达式转换成查询 | 很复杂 建议参考官网 | 很复杂 建议参考官网 |