1.1 比较操作符
$eq
语法:{
释义:匹配等于(=)指定值的文档
举例:
查询age=20的文档:
db.person.find( { age: { $eq: 20 } } )
相当于:
db.person.find( { age: 20 } )
$gt
语法:{
释义:匹配大于(>)指定值的文档
$gte
语法:{field: {$gte: value} }
释义:匹配大于等于(>=)指定值的文档
$lt
语法:{field: {$lt: value} }
释义:匹配小于(<)指定值的文档
$lte
语法:{ field: { $lte: value} }
释义:匹配小于等于(<=)指定值的文档
$ne
语法:{field: {$ne: value} }
释义:匹配不等于(≠)指定值的文档
$in
语法:{ field: { $in: [
释义:匹配数组中的任一值
举例:
查询该集合中字段qty的值与数组中的任意值相等的文档:
db.inventory.find( { qty: { $in: [ 5, 15 ] } } )
$nin
语法:{ field: { $nin: [
释义:不匹配数组中的值
1.2 逻辑操作符
$or
语法:{ $or: [ {
释义:或 条件查询
举例:
查询age<20或者address是beijing的文档:
db.person.find( { $or: [ { age: { $lt: 20 } }, { address: "beijing" } ] } )
$and
语法:{ $and: [ {
释义:与 条件查询
$not
语法:{ field: { $not: {
释义:查询与表达式不匹配的文档
举例:
查询age不大于20的文档:
db.person.find( { age: { $not: { $gt: 20 } } } )
$nor
语法:{ $nor: [ {
释义:查询与任一表达式都不匹配的文档
举例:
查询age既不等于20,sex也不是男的文档:
db.person.find( { $nor: [ { age: 20 },{ sex: "男"} ] } )
1.3 元素操作符
$exists
语法:{ field: { $exists:
释义:查询存在指定字段的文档
举例:
查询存在phone字段的文档:
db.person.find( { phone: { $exists: true } } )
$type
语法:{ field: { $type:
释义:查询类型为指定类型的文档,3.2版本添加alias别名,各种类型的Number及Alias如下
举例:
假设存在这样一个集合:
{ "_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)}
查询该集合中zipCode字段的数据类型为String类型的文档:
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
语法:
{
{
{
释义:正则表达式查询
举例:
db.products.find( { sku: { $regex: /^ABC/i } } )
$text
语法:
{
$text: {
$search:
$language:
$caseSensitive:
$diacriticSensitive:
}
}
$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
举例:
假设现有集合:
{ _id: 1, results: [ 82, 85, 88 ] }
{ _id: 2, results: [ 75, 88, 89 ] }
查询results数组中含有区间[80,85)元素的文档(结果为第一条):
db.scores.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } })
$size
语法:{ field: { $size:
释义:匹配数组长度为指定大小的文档
举例:
查询已经集齐了5张福卡的文档:
db.person.find({card:{$size:5}})
1.7 Bitwise Query Operators
请参考官网
1.8投影操作符
$(projection)
释义:查询数组中首个匹配条件的元素,相当于findOne()方法
举例:
假设现有如下集合students:
{ "_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 ] }
查询semester=1,并且grades中符合大于等于85的元素的第一个元素:
db.students.find( { semester: 1, grades: { $gte: 85 } },{ "grades.$": 1 } )
返回如下结果:
{ "_id" : 1, "grades" : [ 87 ] }{ "_id" : 2, "grades" : [ 90 ] }{ "_id" : 3, "grades" : [ 85 ] }
$elemMatch(projection)
释义:用于数组或内嵌文档中的元素匹配(子元素匹配),只会返回匹配的第一个元素!!!
举例:
假设现有如下集合:
{
_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 },
]
}
查询zipcode为63109并且students数组中school=102的文档:
db.schools.find( { zipcode: "63109" },{ students: { $elemMatch: { school: 102 } } } )
返回如下结果:
{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }{ "_id" : 3 }
$meta
语法:{ $meta:
释义:请参考官网
$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: {
释义:将文档中的某个field对应的value自增/减某个数字amount
举例:
将_id为1的文档的age字段在原来的基础上+1:
db.person.update( { _id: 1 }, { $inc: { age: 1} })
$mul
语法:{ $mul: { field:
释义:将文档中的某个field对于的value做乘法操作
举例:
将_id为1的文档的price值乘以1.25并更新:
db.products.update( { _id: 1 }, { $mul: { price: 1.25 } })
$rename
语法:{$rename: {
释义:重命名文档中的指定字段的名
举例:
将_id为1的文档的nickname字段重命名为alias,cell字段重命名为mobile
db.person.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } )
$setOnInsert
语法:
db.collection.update(
释义:配合upsert操作,在作为insert时可以为新文档扩展更多的field
举例:
将_id为1的文档的item字段更改为apple,并插入新字段defaultQty,值为100
db.products.update( { _id: 1 }, { $set: { item: "apple" }, $setOnInsert: { defaultQty: 100 } }, { upsert: true })
$set
语法:{ $set: {
释义:更新文档中的某一个字段,而不是全部替换
举例:
假设现有文档:
{_id:1,name:"zhangsan",sex:"男"}
如果这样写:
db.person.update({_id:1},{sex:"女"});
则更改之后的结果是酱的:
{_id:1,sex:"女"}
若只想更改sex字段,可以这样写:
db.person.update({_id:1},{$set:{sex:"女"}});
$unset
语法:{ $unset: {
释义:删除文档中的指定字段,若字段不存在则不操作
举例:
删除_id为1的文档的name字段
db.person.update( { _id: 1}, { $unset: { name:"" } })
$min
语法:{ $min: {
释义:将文档中的某字段与指定值作比较,如果原值小于指定值,则不更新;若大于指定值,则更新
举例:
假设现有文档:
{ _id: 1, highScore: 800, lowScore: 200 }
执行:db.scores.update( { _id: 1 }, { $min: { lowScore: 150 } } )
执行结果:{ _id: 1, highScore: 800, lowScore: 150 }
$max
语法:{ $max: {
释义:与$min功能相反
$currentDate
语法:{ $currentDate: {
释义:设置指定字段为当前时间
举例:
db.person.update( { _id: 1 }, { $currentDate: { "lastLogin": { $type: "timestamp" } } })