假设现有如下集合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的document中"grades"中字段的第一个元素:
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 } $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 ] } } ) 更新 字段更新 $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( , { $setOnInsert: { : , ... } }, { 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: { : , ... } }
释义:更新文档中的某一个字段,而不是全部替换
举例:
假设现有文档:
{_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" } } }) 数组更新 $(update)语法:{ ".$" : value }
释义:请参考官网
$addToSet语法:{ $ addToSet : { < field1 >: < value1 > , ... } }
释义:用于添加一个元素到array中,一般用于update