MongoDB的聚合看起來相當複雜,如果有人能給我一個很好的,簡單的例子讓我牢牢掌握基礎知識,我會很感激。MongoDB Aggregation,我如何獲得一個字段的總和?
想象一個集合,其中包含包含文件名和文件大小的文檔。
如何獲得所有文件大小的總和?
此外,如何獲得僅以字母'a'開頭的文件的總和?
MongoDB的聚合看起來相當複雜,如果有人能給我一個很好的,簡單的例子讓我牢牢掌握基礎知識,我會很感激。MongoDB Aggregation,我如何獲得一個字段的總和?
想象一個集合,其中包含包含文件名和文件大小的文檔。
如何獲得所有文件大小的總和?
此外,如何獲得僅以字母'a'開頭的文件的總和?
下面是使用Asynchronous Java Driver兩個查詢的示例程序:
package example;
import static com.allanbank.mongodb.builder.AggregationGroupField.set;
import static com.allanbank.mongodb.builder.AggregationGroupId.constantId;
import static com.allanbank.mongodb.builder.QueryBuilder.where;
import java.util.regex.Pattern;
import com.allanbank.mongodb.MongoClient;
import com.allanbank.mongodb.MongoCollection;
import com.allanbank.mongodb.MongoFactory;
import com.allanbank.mongodb.bson.Document;
import com.allanbank.mongodb.bson.builder.BuilderFactory;
import com.allanbank.mongodb.bson.builder.DocumentBuilder;
import com.allanbank.mongodb.bson.element.ArrayElement;
import com.allanbank.mongodb.builder.Aggregate;
public class FileSizeAggregation {
public static void main(String[] args) {
MongoClient client = MongoFactory
.createClient("mongodb://localhost:27017");
MongoCollection collection = client.getDatabase("test").getCollection(
"test");
collection.delete(BuilderFactory.start()); // Clear the collection.
// Create some documents.
DocumentBuilder doc = BuilderFactory.start();
for (char first = 'a'; first <= 'z'; ++first) {
for (char second = 'a'; second <= 'z'; ++second) {
doc.reset();
doc.add("name", new String(new char[] { first, second }));
doc.add("size", 10);
collection.insert(doc);
}
}
// Count all file "sizes".
Aggregate.Builder builder = new Aggregate.Builder();
builder.group(constantId("sum"),
set("total").sum("size"),
set("count").count());
System.out.println(new ArrayElement("pipeline", builder.build()
.getPipeline()));
Iterable<Document> docs = collection.aggregate(builder.build());
for (Document d : docs) {
System.out.println(d);
}
// Count all file sizes that start with "a"
builder.reset();
builder.match(where("name").matches(Pattern.compile("^a")));
builder.group(constantId("sum"),
set("total").sum("size"),
set("count").count());
System.out.println(new ArrayElement("pipeline", builder.build()
.getPipeline()));
docs = collection.aggregate(builder.build());
for (Document d : docs) {
System.out.println(d);
}
}
}
我有計劃傾出聚合管道,所以你可以看到它是什麼樣子的外殼。讓我們看看輸出。
pipeline : [
{
'$group' : {
'_id' : 'sum',
total : { '$sum' : '$size' },
count : { '$sum' : 1 }
}
}
]
這是第一個查詢的管道,總和文件的大小。我們使用「$ group」操作符作爲流水線中唯一的階段。我們分配一個常量id('_id':'sum')將所有文檔分組到一個結果文檔中。然後總計和計數行將每個文檔中的大小字段相加並返回文檔計數。這種聚合的結果是這樣的:
{
'_id' : 'sum',
total : 6760,
count : 676
}
676文件(26 * 26)和因爲每個文件是「10」一共是6760看起來不錯。下一個聚合!
這次我們只想總結文件名以字母'a'開頭的文件。
pipeline : [
{
'$match' : {
name : { '$regex' : { $regex : '^a' } }
}
},
{
'$group' : {
'_id' : 'sum',
total : { '$sum' : '$size' },
count : { '$sum' : 1 }
}
}
]
唯一真正的變化是,我們在管道中添加一個步驟$組之前過濾或$文檔的子集相匹配。在這種情況下,正則表達式'^ a'符合法案。 (雙$正則表達式的文件是駕駛員編碼JSON方式的副作用。第一$正則表達式是「匹配」操作者和所述第二表示的MongoDB擴展以表示正則表達式。)
{
'_id' : 'sum',
total : 260,
count : 26
}
結果看起來不錯。 26份文件和260份總數。
HTH, Rob。
你曾見過此頁:http://docs.mongodb.org/manual/tutorial/aggregation-examples/ – 2013-03-04 08:01:08