[ { "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/...