[ { "name": { "first_name": "qingquan", "last_name": "zeng" }, "balance": 100 }, { "name": { "first_name": "fengxia", "last_name": "yu" }, "balance": 200 } ]
插入數據mysql
db.accounts.insert([{"name": {"first_name": "qingquan","last_name": "zeng"},"balance": 100},{"name": {"first_name": "fengxia","last_name": "yu"},"balance": 200}])
$project
git
# aggregate 中的 $project 除了能夠實現投影效果,還直接使用了一個不存在的字段 client_name ,至關於 mysql 中的 as 語法 > db.accounts.aggregate([{ ... $project:{ ... _id:0, ... balance:1, ... client_name:"$name.first_name" ... } ... }]); { "balance" : 100, "client_name" : "qingquan" } { "balance" : 200, "client_name" : "fengxia" }
# 因爲 middle_name 不存在,產生的結果就爲 null 了 > db.accounts.aggregate([{ ... $project:{ ... _id:0, ... balance:1, ... name_arr:["$name.first_name","$name.middle_name","$name.first_name"] ... } ... }]); { "balance" : 100, "name_arr" : [ "qingquan", null, "qingquan" ] } { "balance" : 200, "name_arr" : [ "fengxia", null, "fengxia" ] }
$match
中使用的文檔篩選語法,和讀取文檔時的篩選語法相同github
db.accounts.aggregate([ { $match: { "name.first_name": 'fengxia' } } ]) { "_id" : ObjectId("5d80fd4471c6b2236fb80de9"), "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200 }
將 $project
、 $match
、$skip
、$limit
相結合sql
db.accounts.aggregate([ { $match: { $or: [ { "name.first_name": 'fengxia' }, { "name.first_name": 'qingquan' }, ] } }, { $project: { _id: 0 } }, { $skip: 1 }, { $limit: 1 } ]) { "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200 }
$unwind
對本節的數據進行修改shell
db.accounts.update({'name.first_name':'qingquan'},{ $set:{ "currency":["CNY","USD"] } }) db.accounts.update({'name.first_name':'fengxia'},{ $set:{ "currency":"GBP" } })
修改後的數據以下,一個用戶的currency是數組,另外一個用戶的currency是字符串json
> db.accounts.find() { "_id" : ObjectId("5d80fd4471c6b2236fb80de8"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : [ "CNY", "USD" ] } { "_id" : ObjectId("5d80fd4471c6b2236fb80de9"), "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200, "currency" : "GBP" }
使用unwind對數組元素進行平鋪,能夠將currency爲數組的記錄,從一條記錄拆分爲多條記錄數組
db.accounts.aggregate([ { $unwind: { path: "$currency" } } ]) { "_id" : ObjectId("5d80fd4471c6b2236fb80de8"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : "CNY" } { "_id" : ObjectId("5d80fd4471c6b2236fb80de8"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : "USD" } { "_id" : ObjectId("5d80fd4471c6b2236fb80de9"), "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200, "currency" : "GBP" }
爲了方便排查,還能夠在設定一個字段,用於數組展開後標記每一個元素在原數組的位置code
db.accounts.aggregate([ { $unwind: { path: "$currency", includeArrayIndex:"origin_index" } } ]) { "_id" : ObjectId("5d80c37349f3060f1212a055"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : "CNY", "origin_index" : NumberLong(0) } { "_id" : ObjectId("5d80c37349f3060f1212a055"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : "USD", "origin_index" : NumberLong(1) } { "_id" : ObjectId("5d80c37349f3060f1212a056"), "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200, "currency" : "GBP", "origin_index" : null }
還有一點須要注意的是,$unwind
在產生結果前,默認會直接過濾掉以下記錄:ip
若是不想過濾的話,能夠設定 preserveNullAndEmptyArrays 爲 true文檔
db.accounts.aggregate([ { $unwind: { path: "$currency", includeArrayIndex: "origin_index", preserveNullAndEmptyArrays: true } } ])
$sort
db.accounts.aggregate([ { $sort: { balance: -1 } } ]) { "_id" : ObjectId("5d80c37349f3060f1212a056"), "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200, "currency" : "GBP" } { "_id" : ObjectId("5d80c37349f3060f1212a055"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : [ "CNY", "USD" ] }
MongoDB 聚合操做重複問題 https://jacoobwang.github.io/...