单一用途的聚合方法:db.collection.count(), db.collection.group(), db.collection.distinct()。
db.collection.count(query, options) 返回匹配查询结果的数量 相当于mysql的语法:select count(1) from orders where 条件。
> db.orders.find()
{ "_id" : ObjectId("57383f492bd2092c7ed0fec7"), "ino" : "001", "quantity" : 2, "
price" : 4 }
{ "_id" : ObjectId("57383f492bd2092c7ed0fec8"), "ino" : "002", "quantity" : 2, "
price" : 6 }
{ "_id" : ObjectId("57383f492bd2092c7ed0fec9"), "ino" : "003", "quantity" : 3, "
price" : 5 }
> db.orders.count()
3
> db.orders.count({quantity:{$gt:2}})
1
也可以这样获取返回匹配查询结果的数量:
var cursor=db.items.find() 可以以查询只包含索引键的条件, cursor.count()。
> db.orders.find()
{ "_id" : ObjectId("57383f492bd2092c7ed0fec7"), "ino" : "001", "quantity" : 2, "
price" : 4 }
{ "_id" : ObjectId("57383f492bd2092c7ed0fec8"), "ino" : "002", "quantity" : 2, "
price" : 6 }
{ "_id" : ObjectId("57383f492bd2092c7ed0fec9"), "ino" : "003", "quantity" : 3, "
price" : 5 }
> db.orders.distinct("quantity")
[ 2, 3 ]
> db.orders.find()
{ "_id" : ObjectId("573848342bd2092c7ed0feca"), "onumber" : "001", "date" : ISOD
ate("2014-01-02T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 2, "price"
: 5, "pnumber" : "p003" } }
{ "_id" : ObjectId("573848342bd2092c7ed0fecb"), "onumber" : "002", "date" : ISOD
ate("2014-01-03T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 1, "price"
: 4, "pnumber" : "p002" } }
{ "_id" : ObjectId("573848342bd2092c7ed0fecc"), "onumber" : "003", "date" : ISOD
ate("2014-01-04T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 10, "price
" : 2, "pnumber" : "p001" } }
{ "_id" : ObjectId("573848342bd2092c7ed0fecd"), "onumber" : "003", "date" : ISOD
ate("2014-01-04T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 30, "price
" : 4, "pnumber" : "p002" } }
{ "_id" : ObjectId("573848342bd2092c7ed0fece"), "onumber" : "004", "date" : ISOD
ate("2014-01-05T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 5, "price"
: 4, "pnumber" : "p002" } }
> db.orders.group({
... key: {'item.pnumber':1},
... initial : {"total":0},
... reduce : function Reduce(doc, out) {
... out.total+=doc.item.quantity
... } });
[
{
"item.pnumber" : "p003",
"total" : 2
},
{
"item.pnumber" : "p002",
"total" : 36
},
{
"item.pnumber" : "p001",
"total" : 10
}
]
db.orders.group({
key: {date:1},
initial : {"pnumbers":{}},
reduce : function Reduce(doc, out) {
if(out.pnumbers[doc.item.pnumber]==null){
out.pnumbers[doc.item.pnumber]=new Object();
out.pnumbers[doc.item.pnumber]=doc.item.quantity;
}else{
out.pnumbers[doc.item.pnumber]+=doc.item.quantity;
}
},finalize : function Finalize(doc) {
for(i in doc.pnumbers)
{
if (doc.pnumbers[i] < 20)
{
delete doc.pnumbers[i];
}
}
} });
[
{
"date" : ISODate("2014-01-02T16:03:00Z"),
"pnumbers" : {
}
},
{
"date" : ISODate("2014-01-03T16:03:00Z"),
"pnumbers" : {
}
},
{
"date" : ISODate("2014-01-04T16:03:00Z"),
"pnumbers" : {
"p002" : 30
}
},
{
"date" : ISODate("2014-01-05T16:03:00Z"),
"pnumbers" : {
}
}
]
db.orders.group({
key: {date:1},
initial :{"total":0,"money":0},
reduce : function Reduce(doc, out) {
out.total+=doc.item.quantity;
out.money+=doc.item.quantity*doc.item.price;
},
finalize : function Finalize(out) {
out.avg=out.money/out.total
return out;
}
});
[
{
"date" : ISODate("2014-01-02T16:03:00Z"),
"total" : 2,
"money" : 10,
"avg" : 5
},
{
"date" : ISODate("2014-01-03T16:03:00Z"),
"total" : 1,
"money" : 4,
"avg" : 4
},
{
"date" : ISODate("2014-01-04T16:03:00Z"),
"total" : 40,
"money" : 140,
"avg" : 3.5
},
{
"date" : ISODate("2014-01-05T16:03:00Z"),
"total" : 5,
"money" : 20,
"avg" : 4
}
]
> db.orders.find({})
{ "_id" : ObjectId("573848342bd2092c7ed0feca"), "onumber" : "001", "date" : ISOD
ate("2014-01-02T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 2, "price"
: 5, "pnumber" : "p003" } }
{ "_id" : ObjectId("573848342bd2092c7ed0fecb"), "onumber" : "002", "date" : ISOD
ate("2014-01-03T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 1, "price"
: 4, "pnumber" : "p002" } }
{ "_id" : ObjectId("573848342bd2092c7ed0fecc"), "onumber" : "003", "date" : ISOD
ate("2014-01-04T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 10, "price
" : 2, "pnumber" : "p001" } }
{ "_id" : ObjectId("573848342bd2092c7ed0fecd"), "onumber" : "003", "date" : ISOD
ate("2014-01-04T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 30, "price
" : 4, "pnumber" : "p002" } }
{ "_id" : ObjectId("573848342bd2092c7ed0fece"), "onumber" : "004", "date" : ISOD
ate("2014-01-05T16:03:00Z"), "cname" : "zcy", "item" : { "quantity" : 5, "price"
: 4, "pnumber" : "p002" } }
> db.orders.group({
... keyf: function (doc){
... return{'month':doc.date.getMonth()+1};
... },
... initial :{"total":0,"money":0},
... reduce : function Reduce(doc, out) {
... out.total+=doc.item.quantity;
... out.money+=doc.item.quantity*doc.item.price;
...
... },
... finalize : function Finalize(out) {
... out.avg=out.money/out.total
... return out;
... }
... });
[ { "month" : 1, "total" : 48, "money" : 174, "avg" : 3.625 } ]