Applies an aggregation pipeline over the collection.

var client = new MongoClient("mongodb://mongo:27017/")
var db_suffix = "NIT_TESTING_ID".environ
var db_name = "test_{db_suffix}"
var db = client.database(db_name)
var col = db.collection("test_aggregate")

col.drop

col.insert("""{ "cust_id": "A123", "amount": 500, "status": "A"}""".parse_json.as(JsonObject))
col.insert("""{ "cust_id": "A123", "amount": 250, "status": "A"}""".parse_json.as(JsonObject))
col.insert("""{ "cust_id": "B212", "amount": 200, "status": "A"}""".parse_json.as(JsonObject))
col.insert("""{ "cust_id": "A123", "amount": 300, "status": "D"}""".parse_json.as(JsonObject))

var res = col.aggregate("""[
    { "$match": { "status": "A" } },
    { "$group": { "_id": "$cust_id", "total": { "$sum": "$amount" } } },
      { "$sort" : { "_id": 1 } }
]""".parse_json.as(JsonArray))

assert res[0].to_json == """{"_id":"A123","total":750}"""
assert res[1].to_json == """{"_id":"B212","total":200}"""

Property definitions

mongodb $ MongoCollection :: aggregate
	# Applies an aggregation `pipeline` over the collection.
	#
	# ~~~
	# var client = new MongoClient("mongodb://mongo:27017/")
	# var db_suffix = "NIT_TESTING_ID".environ
	# var db_name = "test_{db_suffix}"
	# var db = client.database(db_name)
	# var col = db.collection("test_aggregate")
	#
	# col.drop
	#
	# col.insert("""{ "cust_id": "A123", "amount": 500, "status": "A"}""".parse_json.as(JsonObject))
	# col.insert("""{ "cust_id": "A123", "amount": 250, "status": "A"}""".parse_json.as(JsonObject))
	# col.insert("""{ "cust_id": "B212", "amount": 200, "status": "A"}""".parse_json.as(JsonObject))
	# col.insert("""{ "cust_id": "A123", "amount": 300, "status": "D"}""".parse_json.as(JsonObject))
	#
	# var res = col.aggregate("""[
	#	{ "$match": { "status": "A" } },
	#	{ "$group": { "_id": "$cust_id", "total": { "$sum": "$amount" } } },
        #       { "$sort" : { "_id": 1 } }
	# ]""".parse_json.as(JsonArray))
	#
        # assert res[0].to_json == """{"_id":"A123","total":750}"""
	# assert res[1].to_json == """{"_id":"B212","total":200}"""
	# ~~~
	fun aggregate(pipeline: JsonArray): Array[JsonObject] do
		var q = new JsonObject
		q["pipeline"] = pipeline
		var res = new Array[JsonObject]
		var c = native.aggregate(q.to_bson.native)
		if c == null then return res
		var cursor = new MongoCursor(c)
		while cursor.is_ok do
			res.add cursor.item
			cursor.next
		end
		return res
	end
lib/mongodb/mongodb.nit:625,2--662,4