1. 程式人生 > >mongodb高階查詢aggregate使用,主要用於統計分析,篩選排序測試

mongodb高階查詢aggregate使用,主要用於統計分析,篩選排序測試

1 and or 使用

    >db.col.find({$or:[{key1: value1}, {key2:value2}]})

2 where使用,和sql一樣
查詢已經有回款,但是沒有完成回款的訂單

    >order
    >db.info.find({'$where': "this.price > this.received_money",status:2}).count()

3 條件操作符號

(>) 大於 - $gt
(<) 小於 - $lt
(>=) 大於等於 - $gte
(<= ) 小於等於 - $lte
db.col.find({likes : {$lt : 150}})

4 陣列巢狀查詢

>roster
    >db.domain_set.find({})
    { "_id" : ObjectId("55cdb554b9518f0121a9870f"), "did" : NumberLong(75707), "hide_account" : 0, "pds" : { "details" : [ { "key" : "姓名", "type" : 0, "check" : 1 }, { "key" : "性別", "type" : 0, "check" : 1 }, { "key" : "聯絡方式", "type" : 0, "check" : 1 }, { "key"
: "部門", "type" : 0, "check" : 1 }, { "key" : "職位", "type" : 0, "check" : 1 }, { "key" : "工號", "type" : 0 }, { "key" : "郵箱", "type" : 0 }, { "key" : "地址", "type" : 0 }, { "key" : "生日", "type" : 1 }, { "key" : "籍貫", "type" : 1 }, { "key" : "民族", "type" : 1 }, { "key" : "身份證號", "type" : 1, "check" : 1 }, { "key"
: "婚姻狀況", "type" : 1 }, { "key" : "子女", "type" : 1, "check" : 1 }, { "key" : "家庭住址", "type" : 1 }, { "key" : "緊急聯絡人", "type" : 1 }, { "key" : "緊急聯絡電話", "type" : 1 }, { "key" : "畢業日期", "type" : 1 }, { "key" : "入職日期", "type" : 1, "check" : 1 }, { "key" : "111", "type" : 3, "show_name" : "111", "check" : 1 }, { "key" : "222", "type" : 3, "show_name" : "222" }, { "key" : "333", "type" : 3, "show_name" : "333", "check" : 1 } ], "key_alloc" : 100 }, "udversion" : 50 } { "_id" : ObjectId("55d693c2b9518f0121ada57f"), "did" : NumberLong(11111), "hide_account" : 0, "udversion" : 1 } db.domain_set.find({"pds.details":{"$elemMatch":{"show_name" : "1111"}}}) db.test.find({"pds.details.19.key":"1111"})

5 只顯示某幾個欄位
查詢did=10000的公司下面的訂單,只顯示price和order_id欄位

order
db.info.find({did:10000},{price:1,order_id:1})

6 分頁查詢–limit和skip
查詢did=10000的已經確認的訂單,按照order_id(最新建立時間排序)

order
顯示前15個,第一頁
db.info.find({did:10000,status:2},{order_id:1,price:1}).sort({order_id:-1}).limit(15)
載入16到30頁,第二頁
db.info.find({did:10000,status:2},{order_id:1,price:1}).sort({order_id:-1}).limit(15).skip(15)

7 aggregate使用,相當於shell裡面的”|”
上面的幾乎全部可以用aggregate進行查詢
與sql對應關係

sql         mongodb

WHERE       $match  //match裡面可以用and,or,以及邏輯判斷,但是好像不能用where
GROUP BY    $group
HAVING      $match
SELECT      $project
ORDER BY    $sort
LIMIT       $limit
SUM()       $sum
COUNT()     $sum
特殊:暫時還沒有用到
$unwind    將陣列元素拆分為獨立欄位
$goNear 會返回一些座標值,這些值以按照距離指定點距離由近到遠進行排序


數字運算子
$multiply$add$subtract$mod       取模
$divide
order專案中使用:
1 統計某一段時間的訂單總額和訂單數量:
db.info.aggregate([
    {
     $match:{
            did:10000,
            status:2,
            ordered_time:{$gt:1488297600000,$lt:1490976000000}
            }
    },
    {
    $group: {
        _id: null,
        total: { $sum: "$price" },
        order_num:{$sum:1}
            }
    }
])
2 按照未回款的金額大小排序,同時顯示訂單金額,未回款金額
db.info.aggregate([
    {
     $match:{
            did:10000,
            status:2,
            ordered_time:{$gt:1488297600000,$lt:1490976000000}
            }
    },
    {
    $project:{
        price:1,
        did:1,
        order_id:1,
        notpay:{$subtract:["$price","$received_money"]}
    }
    },
    {
    $sort:{
        notpay:-1
    }
    }
])

8 其他例項:
2 統計已經完成回款的訂單

db.info.find({  $or:[{'$where': "this.price <= this.received_money"},{price:0}],
                    did:10000,
                    status:2,
                    ordered_time:{$gt:1488297600000,$lt:1490976000000}
                    },
                    {price:1}).sort({price:-1})
3 查詢所有未完成回款的訂單
>db.info.find({ $or:[{'$where': "this.price > this.received_money"},{received_money:{$exists:false}}],
                    did:10000,
                    status:2,
                    ordered_time:{$gt:1488297600000,$lt:1490976000000}
                    },
                    {price:1}).sort({price:-1})

暫時不用看,附近的客戶統計使用

$goNear使用方法
    db.places.aggregate([

{

$geoNear: {

near: [40.724, -73.997],

distanceField: "dist.calculated",

maxDistance: 0.008,

query: { type: "public" },

includeLocs: "dist.location",

uniqueDocs: true,

num: 5

}

}

])

注意: 1.使用$goNear只能在管道處理的開始第一個階段進行

     2.必須指定distanceField,該欄位用來決定是否包含距離欄位