phoenix13

导航

 

1. $sum: add 1 for each document in group

example1:

select manufacturer,count(*) from xx

group by manufacturer

{
    "_id" : ObjectId("50b1aa983b3d0043b51b2c52"),
    "name" : "Nexus 7",
    "category" : "Tablets",
    "manufacturer" : "Google",
    "price" : 199
}

 

db.products.aggregate([  // don't forget the bracket
    {$group:
     {
	 _id:"$manufacturer", 
	 num_products:{$sum:1}
     }
    }
])

 result

{ "_id" : "Amazon", "num_products" : 2 }
{ "_id" : "Sony", "num_products" : 1 }
{ "_id" : "Samsung", "num_products" : 2
{ "_id" : "Google", "num_products" : 1 }
{ "_id" : "Apple", "num_products" : 4 }

 example2:

sum pop for each state

{
    "city" : "CLANTON",
    "loc" : [
        -86.642472,
        32.835532
    ],
    "pop" : 13990,
    "state" : "AL",
    "_id" : "35045"
}
db.zips.aggregate([
{$group:
    {_id:"$state","population":{$sum:"$pop"}}
}
])
{ "_id" : "WA", "population" : 4866692 }
{ "_id" : "HI", "population" : 1108229 }
{ "_id" : "CA", "population" : 29754890 }
{ "_id" : "OR", "population" : 2842321 }
{ "_id" : "NM", "population" : 1515069 }
{ "_id" : "UT", "population" : 1722850 }
{ "_id" : "OK", "population" : 3145585 }
{ "_id" : "LA", "population" : 4217595 }

group id as a document

db.zips.aggregate([{$group:{"_id":{"state":"$state","city":"$city"}}}])

 

2. $avg: average

average population of a zipcode for each state

db.zips.aggregate([
{$group:
    {_id:"$state","avg_pop":{$avg:"$pop"}}
}
])

 3. $addToSet

find all zipcode for a city

{ "city" : "PALO ALTO", "loc" : [ -122.149685, 37.444324 ], "pop" : 15965, "state" : "CA", "_id" : "94301" }
{ "city" : "PALO ALTO", "loc" : [ -122.184234, 37.433424 ], "pop" : 1835, "state" : "CA", "_id" : "94304" }
{ "city" : "PALO ALTO", "loc" : [ -122.127375, 37.418009 ], "pop" : 24309, "state" : "CA", "_id" : "94306" }

 

db.zips.aggregate([
{$group:
    {"_id":"$city","postal_codes":{$addToSet:"$_id"}}
}])

 4. $push: similar to $addToSet, but has duplicate

 5. $max, $min

6. double $group stage

{ "_id" : 0, "a" : 0, "b" : 0, "c" : 21 }
{ "_id" : 1, "a" : 0, "b" : 0, "c" : 54 }
{ "_id" : 2, "a" : 0, "b" : 1, "c" : 52 }
{ "_id" : 3, "a" : 0, "b" : 1, "c" : 17 }
{ "_id" : 4, "a" : 1, "b" : 0, "c" : 22 }
{ "_id" : 5, "a" : 1, "b" : 0, "c" : 5 }
{ "_id" : 6, "a" : 1, "b" : 1, "c" : 87 }
{ "_id" : 7, "a" : 1, "b" : 1, "c" : 97 }
db.fun.aggregate([
{$group:
    {_id:{a:"$a", b:"$b"}, c:{$max:"$c"}}
}, 
{$group:
    {_id:"$_id.a", c:{$min:"$c"}}
}])

 7. $projection

data

{
    "city" : "ACMAR",
    "loc" : [
        -86.51557,
        33.584132
    ],
    "pop" : 6055,
    "state" : "AL",
    "_id" : "35004"
}

project to

{
    "city" : "acmar",
    "pop" : 6055,
    "state" : "AL",
    "zip" : "35004"
}

cmd

db.zips.aggregate([
{$project:
    {_id:0, city:{$toLower:"$city"}, pop:1, state:1, zip:"$_id"}
}
])

 8. $match

filters for zipcodes with pop greater than 100,000 people

db.zips.aggregate([
{$match:
    {"pop":{$gt:100000}}
}
])

match or

db.zips.aggregate([{$match:{"state":{$in:["NY","CA"]}}}])
$match:{$or:[{author:"dave"},{author:"john"}]}

http://stackoverflow.com/questions/16902930/mongodb-aggregation-framework-match-or 

9. full text search

the search field should have text index before searcg

db.s.aggregate([
    {$match:
        {$text:{$search:"tree rat"}}
    }
])

 10. $sort

 sort by (state, city), both ascending

db.zips.aggregate([
{$sort:
    {"state":1,"city":1}}
])

 11. $unwind: opposite of $push

db.posts.aggregate([
    /* unwind by tags */
    {"$unwind":"$tags"}
]}

 12. $out: redirect to a new collection, drop previous if exists

db.a.aggregate([
    {$out:"collection_name"}
])

 13. aggregation option

explain

db.zips.aggregate([{$group:{_id:"$state",popu:{$sum:"$pop"}}}],
    {explain:true}
)
db.zips.aggregate([{$group:{_id:"$state",popu:{$sum:"$pop"}}}],
    {allowDiskUse:true}
)

 

posted on 2014-10-08 02:46  phoenix13  阅读(378)  评论(0编辑  收藏  举报