MongoDB命令模式下的條件過濾總結


$exists判斷字段是否存在

查詢所有存在age 字段的記錄
查詢所有不存在name 字段的記錄
舉例如下:C1 表的數據如下:
查詢存在字段age 的數據:
可以看出只顯示出了有age 字段的數據,age_1 的數據並沒有顯示出來查詢在users文檔中"sex"字段存在的記錄:

 

 

MongoDB aggregate 運用篇(轉)

 db.recents.aggregate([{$group:{_id:"$source",count:{$sum:1},total:{$sum:"$sum"}}}]);

db.recents.aggregate([{$match:{"appid":"gfm","date":"2019-01-16"}},{$group:{_id:"$source",count:{$sum:1},total:{$sum:"$sum"}}}]);

  • 最近一直在用mongodb,有時候會需要用到統計,在網上查了一些資料,最適合用的就是用aggregate,以下介紹一下自己運用的心得。。

    別人寫過的我就不過多描述了,大家一搜能搜索到N多一樣的,我寫一下我的總結。

    基礎知識

    請大家自行查找更多,以下是關鍵文檔。

    操作符介紹:

    $project:包含、排除、重命名和顯示字段

    $match:查詢,需要同find()一樣的參數

    $limit:限制結果數量

    $skip:忽略結果的數量

    $sort:按照給定的字段排序結果

    $group:按照給定表達式組合結果

    $unwind:分割嵌入數組到自己頂層文件

    文檔:MongoDB 官方aggregate說明。

    相關使用:

    db.collection.aggregate([array]);

    array可是是任何一個或多個操作符。

    group和match的用法,使用過sqlserver,group的用法很好理解,根據指定列進行分組統計,可以統計分組的數量,也能統計分組中的和或者平均值等。

    group之前的match,是對源數據進行查詢,group之后的match是對group之后的數據進行篩選;

    同理,sort,skip,limit也是同樣的原理;

     
    1. 1 {_id:1,name:"a",status:1,num:1}
    2. 2 {_id:2,name:"a",status:0,num:2}
    3. 3 {_id:3,name:"b",status:1,num:3}
    4. 4 {_id:4,name:"c",status:1,num:4}
    5. 5 {_id:5,name:"d",status:1,num:5}

    以下是示例:

    應用一:統計name的數量和總數;

    db.collection.aggregate([

      {$group:{_id:"$name",count:{$sum:1},total:{$sum:"$num"}}

    ]);

    應用二:統計status=1的name的數量;

    db.collection.aggregate([

      {$match:{status:1}},

      {$group:{_id:"$name",count:{$sum:1}}}

    ]);

    應用三:統計name的數量,並且數量為小於2的;

    db.collection.aggregate([

      {$group:{_id:"$name",count:{$sum:1}},

      {$match:{count:{$lt:2}}}

    ]);

    應用四:統計stauts=1的name的數量,並且數量為1的;

    db.collection.aggregate([

      {$match:{status:1}},

      {$group:{_id:"$name",count:{$sum:1}}},

      {$match:{count:1}}

    ]);

    多列group,根據name和status進行多列

    db.collection.aggregate([

      {$group:{_id:{name:"$name",st:"$status"},count:{$sum:1}}}

    ]);

    $project該操作符很簡單,

    db.collection.aggregate([

      {$project:{name:1,status:1}}

    ]);

    結果是,只有_id,name,status三個字段的表數據,相當於sql表達式 select _id,name,status from collection

    $unwind

    這個操作符可以將一個數組的文檔拆分為多條文檔,在特殊條件下有用,本人暫沒有進行過多的研究。

    以上基本就可以實現大部分統計了,group前條件,group后條件,是重點。

 

增加查詢條件的方式去重

 db.inventory.distinct( "item.sku", { dept: "A" } )

 

db.tb1.find() //查詢全部,用it查看下一頁。
db.tb1.find({"age":1}) //查詢年齡==1的記錄
db.tb1.find({},{"age":1}) //查詢年齡==1的記錄
db.tb1.find({"name":{$all:["a","b"]}}) //查詢name含有a,b的記錄
db.tb1.find({"name":{$exists:true}}) //查詢存在name字段的記錄。
db.tb1.find({"age":{$nin:[12,14]}}) //查詢age不含12,14值的記錄。
db.tb1.find({name) //查詢name含a字母的記錄

.......
總結如下:
查詢格式如下:Db.collection.find({“field”: { operator: val}})
field為colleciton的字段名,operator為操作符,val為比較值。
operator有如下:
$gt,$gte,$lt,$lte: val  v1.
$all :都有, val  {v1,v2,v3...}
$exists:存在, val  true/false;
$ne :不等於, val  v1
$mod: 取模。 Val  [v1取模數,v2余數]
$in :包含某值,val  [v1,v2,v3...]
$nin :不包含某值,val  [v1,v2,v3...]
$size: 指定長度數組, val  v1
$regex: 正則查詢,val  v1 :通配符查詢:/s/ ,但是s/,/是這樣語法錯誤。
Javascript查詢: 編寫function,然后查詢。

>Find(條件).count() / limit(v) /skip(v) /sort({“field”: 1/-1},{“field2”: 1/-1}...)
分頁查詢,通過limit,skip,sort組合進行分頁查詢。
如每頁X條,第N頁
> Find(條件).SKIP * X).Limit(X).SORT.
distinct: 查詢指定鍵的不同值。db.runCommand({"distinct":”集合名","key":"字段名"})
group: 較復雜。

 

db.COMMODITY_COMMODITY.find(
        {
            "areaCode" : "320100" ,
            "backCatalogId" : { "$in" : [ 111111, 22222]} ,
            "typeCode" : { "$in" : [ "appointment" , "groupon"]} ,
            "status" : "1" ,
            "name" : { "$regex" : "汽車"}
        },{"backCatalogId":true,"_id":0}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM