MongoDB Aggregate

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}

)

 

你可能感兴趣的:(mongodb)