MongoDB中“$”操作符表达式汇总 (2)

假设现有如下集合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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxzpj.html