[TOC]
说明:本文来自于https://www.bilibili.com/video/av36394924/?p=2视频讲解
官方文档:https://docs.mongodb.com/ 4.2版本
比较运算符
名称 | 描述 |
---|---|
$gt |
匹配大于指定值的值。 |
$eq |
匹配等于指定值的值。 |
$gte |
匹配大于或等于指定值的值。 |
$in |
匹配数组中指定的任何值。 |
$lt |
匹配小于指定值的值。 |
$lte |
匹配小于或等于指定值的值。 |
$ne |
匹配所有不等于指定值的值。 |
$nin |
不匹配数组中指定的任何值。 |
$in
格式: { field: { $in: [<value1>, <value2>, ... <valueN> ] } }
db.inventory.find( { qty: { $in: [ 5, 15 ] } } )
$nin
格式: { field: { $nin: [ <value1>, <value2> ... <valueN> ]} }
db.inventory.find( { qty: { $nin: [ 5, 15 ] } } )
其他
格式: {field: {$gt: value} }
db.inventory.find( { qty: { $gt: 20 } } )
格式: {field: {$gte: value} }
db.inventory.find( { qty: { $gte: 20 } } )
格式: {field: {$lt: value} }
db.inventory.update( { "carrier.fee": { $lt: 20 } }, { $set: { price: 9.99 } } )
格式: { <field>: { $eq: <value> } }
db.inventory.find( { qty: { $eq: 20 } } )
db.inventory.find( { qty: 20 } )
格式: { field: { $lte: value} }
db.inventory.find( { qty: { $lte: 20 } } )
格式: {field: {$ne: value} }
db.inventory.find( { qty: { $ne: 20 } } )
逻辑运算符
名称 | 描述 |
---|---|
$or |
使用逻辑连接查询子句OR 将返回与任一子句的条件匹配的所有文档。 |
$and |
使用逻辑连接查询子句AND 将返回与两个子句的条件匹配的所有文档。 |
$not |
反转查询表达式的效果并返回与查询表达式不匹配的文档 |
$nor |
使用逻辑连接查询子句NOR 将返回所有无法匹配两个子句的文档。 |
$or
格式: { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
$and
格式: { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
db.inventory.find( { $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } } ] } )
$not
格式: { field: { $not: { <operator-expression> } } }
db.inventory.find( { price: { $not: { $gt: 1.99 } } } )
$nor
格式: { $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }
db.inventory.find( { $nor: [ { price: 1.99 }, { sale: true } ] } )
评估查询运算符
名称 | 描述 |
---|---|
$mod |
对字段的值执行模运算,并选择具有指定结果的文档。 |
$regex |
选择值与指定正则表达式匹配的文档。 |
$text |
执行文本搜索。 |
$where |
匹配满足JavaScript表达式的文档。 |
$mod
格式: { field: { $mod: [ divisor, remainder ] } }
#取模, 模4等于0的
db.inventory.find( { qty: { $mod: [ 4, 0 ] } } )
$regex
性能不高, 全表扫描
格式:
{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } } 这种是常用的
{ name: { $regex: '(?i)a(?-i)cme' } }
$text
MongoDB 从3.2 版本以后添加了对中文索引的支持
格式:
{
$text:
{
$search: <string>,
$language: <string>,
$caseSensitive: <boolean>,
$diacriticSensitive: <boolean>
}
}
db.articles.find( { $text: { $search: "coffee" } } )
$where
全表扫描。 相当于循环每一行的数据, 其中this也就是表示是当前的一行,后面接的是一个function模式。
db.players.find( { $where: function() {
return (hex_md5(this.name) == "9b53e667f30cd329dca1ec9e6a83e994")
} } );
数组查询运算符
名称 | 描述 |
---|---|
$all |
匹配包含查询中指定的所有元素的数组。 |
$elemMatch |
如果数组字段中的元素与所有指定$elemMatch 条件匹配,则选择文档。 |
$size |
如果数组字段是指定大小,则选择文档。 |
$all
格式: { <field>: { $all: [ <value1> , <value2> ... ] } }
{ tags: { $all: [ "ssl" , "security" ] } }
相当于
{ $and: [ { tags: "ssl" }, { tags: "security" } ] }
$elemMatch
只要有一个条件满足,就返回。 针对的事数组
格式: { <field>: { $elemMatch: { <query1>, <query2>, ... } } }
db.scores.find(
{ results: { $elemMatch: { $gte: 80, $lt: 85 } } }
)
$size
格式: db.collection.find( { field: { $size: 2 } } );
db.collection.find( { field: { $size: 1 } } );
字段更新运算符
名称 | 描述 |
---|---|
$currentDate |
将字段的值设置为当前日期,可以是Date或Timestamp。 |
$inc |
按指定的数量增加字段的值。 |
$min |
仅当指定的值小于现有字段值时才更新字段。 |
$max |
仅当指定的值大于现有字段值时才更新字段。 |
$mul |
将字段的值乘以指定的量。 |
$rename |
重命名字段。 |
$set |
设置文档中字段的值。 |
$setOnInsert |
如果更新导致文档插入,则设置字段的值。对修改现有文档的更新操作没有影响。 |
$unset |
从文档中删除指定的字段。 |
$inc
格式: { $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }
db.products.update(
{ sku: "abc123" },
{ $inc: { quantity: -2, "metrics.orders": 1 } }
)
把quantity的值减少2, metrics.orders的值加一
$mul
格式: { $mul: { <field1>: <number1>, ... } }
db.products.update(
{ _id: 2 },
{ $mul: { price: NumberLong(100) } }
)
price 乘以100
$rename
格式: {$rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
db.students.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } )
$setOnInsert
如果查询不到,就插入一条数据, 这个时候的修改和插入是一个原子性。
格式:
db.collection.update(
<query>,
{ $setOnInsert: { <field1>: <value1>, ... } },
{ upsert: true }
)
$set
格式: { $set: { <field1>: <value1>, ... } }
db.products.update(
{ _id: 100 },
{ $set: { "details.make": "zzz" } }
#数组
db.products.update(
{ _id: 100 },
{ $set:
{
"tags.1": "rain gear",
"ratings.0.rating": 2
}
}
)
$unset
格式: { $unset: { <field1>: "", ... } }
db.products.update(
{ sku: "unknown" },
{ $unset: { quantity: "", instock: "" } }
)
$min
格式: { $min: { <field1>: <value1>, ... } }
db.scores.update( { _id: 1 }, { $min: { lowScore: 150 } } )
如果lowScore这个值小于150,就把这个值改成150
$max
格式: { $max: { <field1>: <value1>, ... } }
db.scores.update( { _id: 1 }, { $max: { highScore: 950 } } )
$currentDate
格式: { $currentDate: { <field1>: <typeSpecification1>, ... } }
db.users.update(
{ _id: 1 },
{
$currentDate: {
lastModified: true,
"cancellation.date": { $type: "timestamp" }
}
}
)
数组更新运算符
名字 | 说明 |
---|---|
$ |
充当占位符以更新与查询条件匹配的第一个元素。 |
$addToSet |
仅当数组中尚不存在元素时才将元素添加到数组中。 |
$pop |
删除数组的第一个或最后一个项目。 |
$pull |
删除与指定查询匹配的所有数组元素。 |
$push |
将项添加到数组。 |
$pullAll |
从数组中删除所有匹配的值。 |
$each |
修改$push 和$addToSet 运算符以附加多个项目以进行阵列更新。 |
$position |
修改$push 运算符以指定数组中添加元素的位置。 |
$slice |
修改$push 运算符以限制更新数组的大小。 |
$sort |
修改$push 运算符以重新排序存储在数组中的文档 |
$
格式:
db.collection.update(
{ <array>: value ... },
{ <update operator>: { "<array>.$" : value } }
)
#修改了grades的值为82了, 其中{ _id: 1, grades: 80 },中必须要包含有修改的grades
db.students.updateOne(
{ _id: 1, grades: 80 },
{ $set: { "grades.$" : 82 } }
)
$addToSet
格式: { $addToSet: { <field1>: <value1>, ... } }
db.foo.update(
{ _id: 1 },
{ $addToSet: { colors: "c" } }
)
$pop
格式: { $pop: { <field>: <-1 | 1>, ... } }
-1: 第一个
1: 最后一个
db.students.update( { _id: 1 }, { $pop: { scores: -1 } } )
$pull
格式: { $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
db.stores.update(
{ },
{ $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } },
{ multi: true }
)
$pullAll
格式: { $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } }
db.survey.update( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } )
$push
格式: { $push: { <field1>: <value1>, ... } }
db.students.update(
{ name: "joe" },
{ $push: { scores: { $each: [ 90, 92, 85 ] } } }
)
$each
常组合使用
db.students.update(
{ name: "joe" },
{ $push: { scores: { $each: [ 90, 92, 85 ] } } }
)
$slice
数据分片,限制了数组的数量, 如果是正数就是从前面开始,如果是负数就是从后面开始。
db.students.update(
{ _id: 2 },
{
$push: {
scores: {
$each: [ 100, 20 ],
$slice: 3
}
}
}
)
$sort
db.students.update(
{ _id: 2 },
{ $push: { tests: { $each: [ 40, 60 ], $sort: 1 } } }
)
$position
插入数组中的下标的位置
db.students.update(
{ _id: 1 },
{
$push: {
scores: {
$each: [ 20, 30 ],
$position: 2
}
}
}
)
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付