MongoDB中“$”操作符表达式汇总
<h1 id="mongodb中操作符表达式汇总">MongoDB中“$”操作符表达式汇总</h1><h2 id="查询">查询</h2>
<h3 id="比较操作"><em><strong>比较操作</strong></em></h3>
<h4 id="eq">$eq</h4>
<blockquote>
<p>语法:{ <field>: { $eq: <value> } }</value></field></p>
<p>释义:匹配等于(=)指定值的文档</p>
<p>举例:</p>
<pre><code class="language-yaml">查询age = 20的文档:
db.person.find( { age: { $eq: 20 } } )
相当于:
db.person.find( { age: 20 } )
</code></pre>
</blockquote>
<h4 id="gt">$gt</h4>
<blockquote>
<p>语法:{<field>: {$gt: <value>} }</value></field></p>
<p>释义:匹配大于(>)指定值的文档</p>
<pre><code class="language-python">查询age > 20的文档
db.person.find({
age: {
$gt: 20
}
})
</code></pre>
</blockquote>
<h4 id="gte">$gte</h4>
<blockquote>
<p>语法:{field: {$gte: value} }</p>
<p>释义:匹配大于等于(>=)指定值的文档</p>
<pre><code class="language-python">查询age >= 20的文档
db.person.find({
age: {
$gte: 20
}
})
</code></pre>
</blockquote>
<h4 id="lt">$lt</h4>
<blockquote>
<p>语法:{field: {$lt: value} }</p>
<p>释义:匹配小于(<)指定值的文档</p>
<pre><code class="language-python">查询age < 20的文档
db.person.find({
age: {
$lt: 20
}
})
</code></pre>
</blockquote>
<h4 id="lte">$lte</h4>
<blockquote>
<p>语法:{ field: { $lte: value} }</p>
<p>释义:匹配小于等于(<=)指定值的文档</p>
<pre><code class="language-python">查询age <= 20的文档
db.person.find({
age: {
$lte: 20
}
})
</code></pre>
</blockquote>
<h4 id="ne">$ne</h4>
<blockquote>
<p>语法:{field: {$ne: value} }</p>
<p>释义:匹配不等于(≠)指定值的文档</p>
<pre><code class="language-python">查询age ≠ 20的文档
db.person.find({
age: {
$ne: 20
}
})
</code></pre>
</blockquote>
<h4 id="in">$in</h4>
<blockquote>
<p>语法:{ field: { $in: [<value1>, <value2>, ... <valuen> ] } }</valuen></value2></value1></p>
<p>释义:匹配数组中的任一值</p>
<p>举例:</p>
<pre><code class="language-css">查询该集合中字段qty的值与数组中的任意值相等的文档:
db.inventory.find( { qty: { $in: [ 5, 15 ] } } )
</code></pre>
</blockquote>
<h4 id="nin">$nin</h4>
<blockquote>
<p>语法:{ field: { $nin: [ <value1>, <value2> ... <valuen> ]} }</valuen></value2></value1></p>
<p>释义:不匹配数组中的值</p>
</blockquote>
<h3 id="逻辑操作"><em><strong>逻辑操作</strong></em></h3>
<h4 id="or">$or</h4>
<blockquote>
<p>语法:{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionn> } ] }</expressionn></expression2></expression1></p>
<p>释义:或 条件查询</p>
<p>举例:</p>
<pre><code class="language-groovy">查询age < 20或者address是beijing的文档:
db.person.find( { $or: [ { age: { $lt: 20 } }, { address: "beijing" } ] } )
</code></pre>
</blockquote>
<h4 id="and">$and</h4>
<blockquote>
<p>语法:{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionn> } ] }</expressionn></expression2></expression1></p>
<p>释义:与 条件查询</p>
</blockquote>
<h4 id="not">$not</h4>
<blockquote>
<p>语法:{ field: { $not: { <operator-expression> } } }</operator-expression></p>
<p>释义:查询与表达式不匹配的文档</p>
<p>举例:</p>
<pre><code class="language-css">查询age不大于20的文档:
db.person.find( { age: { $not: { $gt: 20 } } } )
</code></pre>
</blockquote>
<h4 id="nor">$nor</h4>
<blockquote>
<p>语法:{ $nor: [ { <expression1> }, { <expression2> }, ... { <expressionn> } ] }</expressionn></expression2></expression1></p>
<p>释义:查询与任一表达式都不匹配的文档</p>
<p>举例:</p>
<pre><code class="language-less">查询age既不等于20,sex也不是男的文档:
db.person.find( { $nor: [ { age: 20 },{ sex: "男"} ] } )
</code></pre>
</blockquote>
<h3 id="集合字段操作-存在类型"><em><strong>集合字段操作 ——“存在”、“类型”</strong></em></h3>
<h4 id="exists">$exists</h4>
<blockquote>
<p>语法:{ field: { $exists: <boolean> } }</boolean></p>
<p>释义:查询存在指定字段的文档</p>
<p>举例:</p>
<pre><code class="language-css">查询存在phone字段的文档:
db.person.find( { phone: { $exists: true } } )
</code></pre>
</blockquote>
<h4 id="type">$type</h4>
<blockquote>
<p>语法:{ field: { $type: <bson type="" number=""> | <string alias=""> } }</string></bson></p>
<p>释义:查询类型为指定类型的文档,3.2版本添加alias别名,各种类型的Number及Alias如下</p>
</blockquote>
<p><img src="https://img-blog.csdn.net/20170228154236567?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTYzMTMzNjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="img" loading="lazy"></p>
<blockquote>
<p>举例:</p>
<p>假设存在这样一个集合:</p>
<pre><code class="language-groovy">{ "_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)}
</code></pre>
<p>查询该集合中zipCode字段的数据类型为String类型的文档:</p>
<pre><code class="language-lua">db.addressBook.find( { "zipCode" : { $type : 2 } } );
db.addressBook.find( { "zipCode" : { $type : "string" } } );
</code></pre>
</blockquote>
<h3 id="运算操作">运算操作</h3>
<h4 id="mod">$mod</h4>
<blockquote>
<p>语法:{ field: { $mod: [ 除数, 余数 ] } }</p>
<p>释义:取余条件查询</p>
<p>举例:</p>
<pre><code class="language-css">查询age字段的值除以2余0的文档:
db.person.find( { age: { $mod: [ 2, 0 ] } } )
</code></pre>
</blockquote>
<h4 id="regex">$regex</h4>
<blockquote>
<p>语法:</p>
<p>{ <field>: { $regex: /pattern/, $options: '<options>' } }</options></field></p>
<p>{ <field>: { $regex: 'pattern', $options: '<options>' } }</options></field></p>
<p>{ <field>: { $regex: /pattern/<options> } }</options></field></p>
<p>释义:正则表达式查询</p>
<p>举例:</p>
<pre><code class="language-css">db.products.find( { sku: { $regex: /^ABC/i } } )
</code></pre>
</blockquote>
<h4 id="text">$text</h4>
<blockquote>
<p>语法:</p>
<pre><code class="language-php">{
$text: {
$search: <string>,
$language: <string>,
$caseSensitive: <boolean>,
$diacriticSensitive: <boolean>
}
}
</code></pre>
</blockquote>
<ul>
<li>
<ul>
<li>$search ——关键词</li>
<li>$language ——语言,不支持中文!!!支持语言如下:点击</li>
<li>$caseSensitive——是否区分大小写,默认false</li>
<li>$diacriticSensitive——是否区分读音,默认false</li>
</ul>
</li>
</ul>
<blockquote>
<p>释义:文本索引查询</p>
<p>举例:较为复杂,请参考官网</p>
</blockquote>
<h4 id="where">$where</h4>
<blockquote>
<p>释义:把一个含有JavaScript表达式的字符串或者是整个JavaScript函数转换到查询系统中,对内嵌文档不起作用</p>
<p>举例:</p>
<pre><code class="language-php">db.myCollection.find( { $where: "this.credits == this.debits" } );
db.myCollection.find( { $where: function() { return obj.credits == obj.debits; } } );
</code></pre>
</blockquote>
<h3 id="数组操作">数组操作</h3>
<h4 id="all">$all</h4>
<blockquote>
<p>语法:{ < field >: { $ all : [ < value1 > , < value2 > ... ] } }</p>
<p>释义:匹配文档的数组字段中包含所有指定元素的文档</p>
<p>举例:</p>
<pre><code class="language-css">查询articles集合中tags字段(是个数组)包含“ssl”和“security”的文档(包含,但并不是全部等于)
db.articles.find( { tags: { $all: [ [ "ssl", "security" ] ] } } )
</code></pre>
</blockquote>
<h4 id="elemmatchquery重要">$elemMatch(query)<em><strong>重要</strong></em></h4>
<blockquote>
<p>语法:{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }</query2></query1></field></p>
<p>释义:匹配内嵌文档或数组中的部分field</p>
<p>举例:</p>
<p>假设现有集合:</p>
<pre><code class="language-yaml">{ _id: 1, results: [ 82, 85, 88 ] }
{ _id: 2, results: [ 75, 88, 89 ] }
</code></pre>
<p>查询results数组中含有区间[80,85)元素的文档(结果为第一条):</p>
<pre><code class="language-css">db.scores.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } })
</code></pre>
</blockquote>
<h4 id="size">$size</h4>
<blockquote>
<p>语法:{ field: { $size: <number> }</number></p>
<p>释义:匹配数组长度为指定大小的文档</p>
<p>举例:</p>
<pre><code class="language-css">查询已经集齐了5张福卡的文档:
db.person.find({card:{$size:5}})
</code></pre>
</blockquote>
<h3 id="查询相似document操作">查询相似document操作</h3>
<h4 id="projection">$(projection)</h4>
<blockquote>
<p>释义:查询数组中首个匹配条件的元素</p>
<p>举例:</p>
<p>假设现有如下集合students:</p>
<pre><code class="language-json">{ "_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 ] }
</code></pre>
<p>查询semester=1,并且grades符合大于等于85的document中"grades"中字段的第一个元素:</p>
<pre><code class="language-yaml">db.students.find( { semester: 1, grades: { $gte: 85 } },{ "grades.$": 1 } )
</code></pre>
<p>返回如下结果:</p>
<pre><code class="language-json">{ "_id" : 1, "grades" : [ 87 ] }{ "_id" : 2, "grades" : [ 90 ] }{ "_id" : 3, "grades" : [ 85 ] }
</code></pre>
</blockquote>
<h4 id="elemmatchprojection">$elemMatch(projection)</h4>
<blockquote>
<p>释义:用于数组或内嵌文档中的元素匹配(子元素匹配),只会返回匹配的第一个元素!!!</p>
<p>举例:</p>
<p>假设现有如下集合:</p>
<pre><code class="language-yaml">{
_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 },
]
}
</code></pre>
<p>查询zipcode为63109并且students数组中school=102的文档:</p>
<pre><code class="language-css">db.schools.find( { zipcode: "63109" },{ students: { $elemMatch: { school: 102 } } } )
</code></pre>
<p>返回如下结果:</p>
<pre><code class="language-json">{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }{ "_id" : 3 }
</code></pre>
</blockquote>
<h4 id="sliceprojection">$slice(projection)</h4>
<blockquote>
<p>释义:在查询中将数组进行切片(类似于分页)</p>
<p>举例:</p>
<pre><code class="language-css">(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 ] } } )
</code></pre>
</blockquote>
<h2 id="更新">更新</h2>
<h3 id="字段更新">字段更新</h3>
<h4 id="inc">$inc</h4>
<blockquote>
<p>语法:{ $inc: { <field1>: , <field2>: , ... } }</amount2></field2></amount1></field1></p>
<p>释义:将文档中的某个field对应的value自增/减某个数字amount</p>
<p>举例:</p>
<pre><code class="language-less">将_id为1的文档的age字段在原来的基础上+1:
db.person.update( { _id: 1 }, { $inc: { age: 1} })
</code></pre>
</blockquote>
<h4 id="mul">$mul</h4>
<blockquote>
<p>语法:{ $mul: { field: <number> } }</number></p>
<p>释义:将文档中的某个field对于的value做乘法操作</p>
<p>举例:</p>
<pre><code class="language-less">将_id为1的文档的price值乘以1.25并更新:
db.products.update( { _id: 1 }, { $mul: { price: 1.25 } })
</code></pre>
</blockquote>
<h4 id="rename">$rename</h4>
<blockquote>
<p>语法:{$rename: { <field1>: <newname1>, <field2>: <newname2>, ... } }</newname2></field2></newname1></field1></p>
<p>释义:重命名文档中的指定字段的名</p>
<p>举例:</p>
<pre><code class="language-less">将_id为1的文档的nickname字段重命名为alias,cell字段重命名为mobile
db.person.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } )
</code></pre>
</blockquote>
<h4 id="setoninsert">$setOnInsert</h4>
<blockquote>
<p>语法:</p>
<p>db.collection.update( <query>, { $setOnInsert: { <field1>: <value1>, ... } }, { upsert: true })</value1></field1></query></p>
<p>释义:配合upsert操作,在作为insert时可以为新文档扩展更多的field</p>
<p>举例:</p>
<pre><code class="language-groovy">将_id为1的文档的item字段更改为apple,并插入新字段defaultQty,值为100
db.products.update( { _id: 1 }, { $set: { item: "apple" }, $setOnInsert: { defaultQty: 100 } }, { upsert: true })
</code></pre>
</blockquote>
<p><em><strong>详解</strong></em></p>
<blockquote>
<p><span class="math inline">\(setOnInsert
\)</span>setOnInsert指令往往同upsert、$set指令配合使用。mongodb官网说明:</p>
<p>If an update operation with upsert: true results in an insert of a document, then $setOnInsert assigns the specified values to the fields in the document. If the update operation does not result in an insert, $setOnInsert does nothing.</p>
<p>如果upsert设为true。当满足查询条件的记录存在,则不执行<span class="math inline">\(setOnInsert中的操作,当满足条件的记录不存在则执行\)</span>setOnInsert操作。与<span class="math inline">\(set指令配合使用,可以作为\)</span>set指令的补充。当满足查询条件的记录存在,则执行 <span class="math inline">\(set操作,当满足查询条件的记录不存在,则新增一条记录,其中包含\)</span>set指令设置的属性以及$setOnInsert 指令设置的属性。</p>
<p>exp:</p>
<p>db.getCollection('tt').update(<br>
{"_id" : ObjectId("5dc2cd255ee0a3a2c2c4c384")},<br>
{<br>
"<span class="math inline">\(setOnInsert": { "pon" : "a" },
"\)</span>set": { "a" : "e" }<br>
},<br>
{ upsert: true }<br>
)<br>
当满足查询条件{"_id" : ObjectId("5dc2cd255ee0a3a2c2c4c384")}的记录存在,则只更新或新增其{ "a" : "e" }属性。如果不存在,将创建一条包含自动生成主键的记录:</p>
<p>注意:<br>
<span class="math inline">\(setOnInsert和\)</span>set中的属性记录不能相同</p>
<p>mongo更新语句使用<span class="math inline">\(setOnInsert、\)</span>upsert和<span class="math inline">\(set、\)</span>upsert的区别<br>
对于查询到的记录。<br>
使用<span class="math inline">\(set、\)</span>upsert 存在则更新,不存在则新增<br>
使用<span class="math inline">\(setOnInsert、\)</span>upsert存在则不操作,不存在则新增</p>
</blockquote>
<h4 id="set">$set</h4>
<blockquote>
<p>语法:{ $set: { <field1>: <value1>, ... } }</value1></field1></p>
<p>释义:更新文档中的某一个字段,而不是全部替换</p>
<p>举例:</p>
<p>假设现有文档:</p>
<pre><code class="language-css">{_id:1,name:"zhangsan",sex:"男"}
</code></pre>
<pre><code class="language-less">如果这样写:
db.person.update({_id:1},{sex:"女"});
则更改之后的结果是酱的:
{_id:1,sex:"女"}
若只想更改sex字段,可以这样写:
db.person.update({_id:1},{$set:{sex:"女"}});
</code></pre>
</blockquote>
<h4 id="unset">$unset</h4>
<blockquote>
<p>语法:{ $unset: { <field1>: "", ... } }</field1></p>
<p>释义:删除文档中的指定字段,若字段不存在则不操作</p>
<p>举例:</p>
<pre><code class="language-less">删除_id为1的文档的name字段
db.person.update( { _id: 1}, { $unset: { name:"" } })
</code></pre>
</blockquote>
<h4 id="min">$min</h4>
<blockquote>
<p>语法:{ $min: { <field1>: <value1>, ... } }</value1></field1></p>
<p>释义:将文档中的某字段与指定值作比较,如果原值小于指定值,则不更新;若大于指定值,则更新</p>
<p>举例:</p>
<pre><code class="language-yaml">假设现有文档:
{ _id: 1, highScore: 800, lowScore: 200 }
执行:db.scores.update( { _id: 1 }, { $min: { lowScore: 150 } } )
执行结果:{ _id: 1, highScore: 800, lowScore: 150 }
</code></pre>
</blockquote>
<h4 id="max">$max</h4>
<blockquote>
<p>语法:{ $max: { <field1>: <value1>, ... } }</value1></field1></p>
<p>释义:与$min功能相反</p>
</blockquote>
<h4 id="currentdate">$currentDate</h4>
<blockquote>
<p>语法:{ $currentDate: { <field1>: <typespecification1>, ... } }</typespecification1></field1></p>
<p>释义:设置指定字段为当前时间</p>
<p>举例:</p>
<pre><code class="language-groovy">db.person.update( { _id: 1 }, { $currentDate: { "lastLogin": { $type: "timestamp" } } })
</code></pre>
</blockquote>
<h3 id="数组更新">数组更新</h3>
<h4 id="update">$(update)</h4>
<blockquote>
<p>语法:{ ".$" : value }</array></p>
<p>释义:请参考官网</p>
</blockquote>
<h4 id="addtoset">$addToSet</h4>
<blockquote>
<p>语法:{ $ addToSet : { < field1 >: < value1 > , ... } }</p>
<p>释义:用于添加一个元素到array中,一般用于update</p>
<p>举例:</p>
<pre><code class="language-groovy">假设现有文档:
{ _id: 1, letters: ["a", "b"] }
执行:db.test.update({_id:1},{$addToSet:{letters:"c"}})
结果:{ "_id" : 1, "letters" : [ "a", "b", "c" ] }
执行:db.test.update({_id:1},{$addToSet:{letters:["d","e"]}})
结果:{ "_id" : 1, "letters" : [ "a", "b", "c", [ "d", "e" ] ] }
注意,若想让添加的多个元素分开成单个元素的效果,请参考$each的使用方法
</code></pre>
</blockquote>
<h4 id="pop">$pop</h4>
<blockquote>
<p>语法:{ $pop: { <field>: <-1 | 1>, ... } }</field></p>
<p>释义:删除数组中的第一个或最后一个元素,-1表示第一个,没错,第一个;1表示最后一个!</p>
<p>举例:</p>
<pre><code class="language-less">db.test.update({_id:1},{$pop:{letters:-1}});
</code></pre>
</blockquote>
<h4 id="pullall">$pullAll</h4>
<blockquote>
<p>语法:{ $pullAll: { <field1>: [ <value1>, <value2> ... ], ... } }</value2></value1></field1></p>
<p>释义:删除数组或内嵌文档字段中所有指定的元素</p>
<p>举例:</p>
<pre><code class="language-yaml">假设现有文档:{ _id: 1, scores: [ 0, 2, 5, 5, 1, 0 ] }
执行:db.test.update( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } )
结果:{ "_id" : 1, "scores" : [ 2, 1 ] }
</code></pre>
</blockquote>
<h4 id="pull">$pull</h4>
<blockquote>
<p>语法:{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }</field2></field1></p>
<p>释义:删除满足条件的元素</p>
<p>举例:</p>
<pre><code class="language-yaml">假设现有文档:{ _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] }
执行:db.test.update( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )
结果:{ _id: 1, votes: [ 3, 5 ] }
</code></pre>
</blockquote>
<h4 id="push">$push</h4>
<blockquote>
<p>语法:{ $push: { <field1>: <value1>, ... } }</value1></field1></p>
<p>释义:往数组中追加指定的元素,若文档中数组不存在,则创建并添加指定元素,自v2.4起,添加了对$.each的支持</p>
<p>举例:</p>
<pre><code class="language-less">db.students.update( { _id: 1 }, { $push: { scores: 89 } })
</code></pre>
</blockquote>
<h4 id="each">$each</h4>
<blockquote>
<p>语法:</p>
<pre><code class="language-clojure">{ $addToSet: { <field>: { $each: [ <value1>, <value2> ... ] } } }
{ $push: { <field>: { $each: [ <value1>, <value2> ... ] } } }
</code></pre>
<p>释义:需要搭配<span class="math inline">\(addToSet或\)</span>push方可使用</p>
</blockquote>
<h4 id="sort">$sort</h4>
<blockquote>
<p>语法:</p>
<pre><code class="language-xml">{
$push: {
<field>: {
$each: [ <value1>, <value2>, ... ],
$sort: <sort specification>
}
}
}
</code></pre>
<p>释义:自v2.4加,配合$push使用,表示给文档中的指定数组元素排序,1是升序,-1是降序</p>
<p>举例:</p>
<pre><code class="language-yaml">db.students.update(
{ _id: 1 },
{
$push: {
quizzes: {
$each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ],
$sort: { score: 1 }
}
}
}
)
</code></pre>
</blockquote>
<h4 id="position">$position</h4>
<blockquote>
<p>语法:</p>
<pre><code class="language-xml">{
$push: {
<field>: {
$each: [ <value1>, <value2>, ... ],
$position: <num>
}
}
}
</code></pre>
<p>释义:自v2.6加,配合$push使用表示往数组元素中的指定位置插入元素</p>
</blockquote>
</div>
<div id="MySignature" role="contentinfo">
抟扶摇而上者九万里<br><br>
来源:https://www.cnblogs.com/fengting0913/p/14616629.html
頁:
[1]