mongo执行逻辑表达式_MongoDB 常用查询操作
MongoDB 查詢操作可實(shí)現(xiàn)大部分關(guān)系型數(shù)據(jù)庫(kù)的常用查詢操作,本文對(duì) MongoDB 常用查詢進(jìn)行講解。
在進(jìn)行操作講解前,先展示當(dāng)前 MongoDB 中已存在的文檔,集合名稱article
條件大小比較操作
查詢文檔時(shí),對(duì)條件的大小、范圍進(jìn)行過濾查詢,以下是常用比較操作符
操作符
說(shuō)明
$eq
查詢與條件值相等的文檔,類似關(guān)系型數(shù)據(jù)庫(kù)的 =
$ne
查詢與條件值不相等或不存在的文檔,類似關(guān)系型數(shù)據(jù)庫(kù)的 !=
$gt
查詢大于條件值的文檔,類似關(guān)系型數(shù)據(jù)庫(kù)的 >
$gte
查詢大于或等于條件值的文檔,類似關(guān)系型數(shù)據(jù)庫(kù)的 >=
$lt
查詢小于條件值的文檔,類似關(guān)系型數(shù)據(jù)庫(kù)的 <
$lte
查詢小于或等于條件值的文檔,類似關(guān)系型數(shù)據(jù)庫(kù)的 <=
$in
查詢 $in 數(shù)據(jù)里值的文檔,類似關(guān)系型數(shù)據(jù)庫(kù)的 in
$nin
與 $in 查詢相反,類似關(guān)系型數(shù)據(jù)庫(kù)的 not in
由于使用大于、小于、等于關(guān)系都差不多,比較好理解,這里就舉一個(gè)例子說(shuō)明,使用$gte來(lái)獲取大于或等于150的 visitor
db.article.find({"visitor":?{$gte:150}})
執(zhí)行結(jié)果:
使用$in時(shí),必須用數(shù)組來(lái)設(shè)置條件值,比如獲取 visitor 為70和150的值
db.article.find({"visitor":?{$in:[70,?150]}})
執(zhí)行結(jié)果:
邏輯操作符
多條件查詢中,條件與條件連接符號(hào)叫做邏輯操作符。常用操作符:
操作符
說(shuō)明
$and
表示所有條件同時(shí)滿足時(shí)成立
$nor
與$and相反,所有條件都不滿足時(shí)成立
$or
只要有一個(gè)條件滿足則成立
$not
表示字段存在并且不符合條件
$and 查詢author=ytao且visitor=150的文檔
db.article.find(
{$and:[
{"author":{$eq:"ytao"}},
{"visitor":{$eq:150}}
]}
)
$nor查詢不是author=ytao和不是visitor=170的文檔
db.article.find(
{$nor:[
{"author":{$eq:"ytao"}},
{"visitor":{$eq:170}}
]}
)
$or查詢author=ytao或visitor=170的文檔
db.article.find(
{$or:[
{"author":{$eq:"ytao"}},
{"visitor":{$eq:170}}
]}
)
$not查詢不是author=ytao的文檔
db.article.find(
{"author":{$not:{$eq:"ytao"}}}
)
元素操作符
對(duì)字段元素上的操作符叫做元素操作符
操作符
說(shuō)明
$exists
判斷文檔中字段是否存在,true為存在,false為不存在
$type
篩選指定字段類型的文檔
$exists查詢author字段存在的文檔
db.article.find(
{"author":{$exists:true}}
)
$type查詢author字段為數(shù)組的文檔
db.article.find(
{"author":{$type:"array"}}
)
正則表達(dá)式
MongoDB 支持正則表達(dá)式匹配文檔,通過正則表達(dá)我們可以實(shí)現(xiàn)關(guān)系型數(shù)據(jù)庫(kù)的模糊查詢,以及更加強(qiáng)大匹配規(guī)則,其使用語(yǔ)法有三種:
{?:?{?$regex:?/pattern/, $ options :?''?}?}
{?:?{?$regex:?'pattern', $ options :?''?}?}
{?:?{?$regex:?/pattern/?}?}
參數(shù)/pattern/和'pattern'都是表示正則表達(dá)式,直接添加字符串可用來(lái)模糊查詢。參數(shù)$options為可選參數(shù),有四個(gè)固定值選擇
options 選項(xiàng)
說(shuō)明
i
匹配過程忽略大小寫
x
匹配過程忽略空格
m
匹配多行數(shù)據(jù),但都是從每行的起點(diǎn)和結(jié)尾匹配
s
將多行轉(zhuǎn)換成一行后進(jìn)行匹配,可匹配換行符\n字符串
模糊查詢author為Tao的示例:
db.article.find(
{"author":{$regex:/Tao/,?$options:'i'}}
)
查詢結(jié)果
從上面查詢結(jié)果中可以看到,數(shù)據(jù)格式也可以進(jìn)行匹配到。
聚合操作
聚合操作可以實(shí)現(xiàn)分組、排序、分頁(yè)、多集合關(guān)聯(lián)查詢等,使用語(yǔ)法格式:
db.collection.aggregate([
{聚合操作一},
{聚合操作二}
])
條件篩選
$match 用來(lái)進(jìn)行條件篩選,可以使用一些條件限制來(lái)進(jìn)行查詢。
語(yǔ)法格式:
db.article.aggregate([
{?$match:??}
])
查詢author = ytao且visitor > 100的文檔
db.article.aggregate([
{?$match:?{
$and:?[
{"author":?{$eq:?"ytao"}},
{"visitor":?{$gt:?100}}
]}
}
])
分組操作
$group 是分組操作符,類似于關(guān)系型數(shù)據(jù)庫(kù)中的group by操作。其語(yǔ)法格式為:
db.collection.aggregate([
{
$group:{
"_id":"$",
:{:"$"}
}
}
])
其中運(yùn)算符如下:
運(yùn)算符
說(shuō)明
$avg
當(dāng)前組的平均數(shù)
$sum
當(dāng)前組的總和
$min
當(dāng)前組的最小值
$max
當(dāng)前組的最大值
$first
當(dāng)前組的第一個(gè)的值
$last
當(dāng)前組的最后一個(gè)的值
$push
數(shù)組形式展示指定的當(dāng)前組字段值
$addToSet
數(shù)組形式展示指定的當(dāng)前組字段不重復(fù)值
分組求出每個(gè)author的visitor平均數(shù)的例子
db.article.aggregate([
{
$group:{
"_id":"$author",
"avg_visitor":{$sum:"$visitor"}
}
}
])
字段顯示
指定查詢后返回的字段使用**$project**,字段指定默認(rèn)值為0,但是_id默認(rèn)為1,顯示指定字段語(yǔ)法為:
db.collection.aggregate([
{
$project:{
"":?<0或1>,
"":<0或1>
}
}
])
展示title和visitor字段示例:
db.article.aggregate([
{
$project:{
"_id":?0,
"title":?1,
"visitor":?1
}
}
])
同時(shí),$project還以搭配$split(字符串拆分)、$substr(截取字符串)、$concat(合并字符串)、$switch(條件判斷)、$toLower(轉(zhuǎn)換成小寫)、$toUpper(轉(zhuǎn)換成大寫)、時(shí)間格式處理等等操作符進(jìn)行操作,語(yǔ)法為:
db.collection.aggregate([
{
$project:{
"":?{:?},
"":?{:?},
}
}
])
例如將title中的字母都轉(zhuǎn)換成大寫
db.article.aggregate([
{
$project:{
"titleField":{?$toUpper:"$title"?}
}
}
])
返回結(jié)果
排序操作
**sort排序用1和-1`表示正序和倒序。
語(yǔ)法格式:
db.collection.aggregate([
{
$sort:{
"":?<1?或?-1>
}
}
])
按visitor字段名進(jìn)行倒序排序:
db.article.aggregate([
{
$sort:{
"visitor":?-1
}
}
])
排序結(jié)果
分頁(yè)操作
分頁(yè)使用 和limit 進(jìn)行分頁(yè)操作。$skip表示跳過文檔的數(shù)量,$limit表示返回的文檔數(shù)量,這兩個(gè)指令使用,類似于關(guān)系型數(shù)據(jù)中的limit , 分頁(yè)操作。
語(yǔ)法格式:
db.collection.aggregate([
{$skip:?},
{$limit:?}
])
查詢第二頁(yè)的兩條數(shù)據(jù)示例:
db.article.aggregate([
{$skip:?2},
{$limit:?2}
])
返回結(jié)果
統(tǒng)計(jì)文檔數(shù)量
$count用來(lái)統(tǒng)計(jì)文檔數(shù)量,進(jìn)行條件篩選時(shí)。
語(yǔ)法格式:
db.collection.aggregate([
{?$count:?""?}
])
統(tǒng)計(jì)全部文檔數(shù)量:
db.article.aggregate([
{?$count:?"數(shù)量"?}
])
統(tǒng)計(jì)結(jié)果:
多集合關(guān)聯(lián)查詢
$lookup 是用來(lái)多集合關(guān)聯(lián)查詢時(shí)使用的,類似于關(guān)系型數(shù)據(jù)庫(kù)中的聯(lián)表查詢。
使用語(yǔ)法:
db.collection.aggregate([
{
$lookup:?{
from:?,
localField:?,
foreignField:?,
as:?
}
}
])
在進(jìn)行多集合關(guān)聯(lián)查詢演示前,先添加一個(gè)集合person,里面添加一條數(shù)據(jù):
查詢age = 18的集合:
db.article.aggregate([
{
$lookup:?{
from:?"person",
localField:?"author",
foreignField:?"author",
as:?"person_info"
}
},
{
$match:{
"person_info.age":?{$eq:?18}
}
}
])
返回結(jié)果:
總結(jié)
對(duì) MongoDB 的常用查詢操作進(jìn)行了解后,可以發(fā)現(xiàn)它和關(guān)系型數(shù)據(jù)操作有很多類似的操作思想。對(duì)于這些操作的使用,相對(duì)也是較為靈活,提供的 API 也是較為強(qiáng)大,幾乎能滿足大部分使用場(chǎng)景的檢索要求。掌握這些查詢操作,可以更高效的獲取 MongoDB 中的文檔。
總結(jié)
以上是生活随笔為你收集整理的mongo执行逻辑表达式_MongoDB 常用查询操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软放弃工业元宇宙!传团队已经完全解散
- 下一篇: 《经济学人》封面文章:互联网搜索战火再燃