English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Aggregationsoperationen verarbeiten Datensätze und geben berechnete Ergebnisse zurück. Aggregationsoperationen gruppieren Werte aus mehreren Dokumenten zusammen und können auf gruppierte Daten verschiedene Operationen ausführen, um ein einzelnes Ergebnis zurückzugeben. In SQL entspricht count()*)und group by entsprechen der MongoDB-Aggregation.
Für die Aggregation in MongoDB sollten Sie aggregate() Methode.
aggregate()Die Grundgrammatik der Methode ist wie folgt-
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
In der Sammlung haben Sie folgende Daten-
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Übersicht', description: 'MongoDB ist keine SQL-Datenbank', by_user: 'oldtoolbag.com, url: 'https://de.oldtoolbag.com, tags: ['mongodb', 'database', 'NoSQL'], likes: 100 , { _id: ObjectId(7df78ad8902d) title: 'NoSQL Übersicht', description: 'No SQL Datenbank ist sehr schnell', by_user: 'oldtoolbag.com, url: 'https://de.oldtoolbag.com, tags: ['mongodb', 'database', 'NoSQL'], likes: 10 , { _id: ObjectId(7df78ad8902e) title: 'Neo4j Übersicht', description: 'Neo4j ist No SQL Datenbank', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: ['neo4j', 'database', 'NoSQL'], likes: 750 ,
Nun, wenn Sie aus der obigen Sammlung eine Liste anzeigen möchten, die angibt, wie viele Tutorials jeder Benutzer geschrieben hat, dann verwenden Sie folgendeaggregate()Methode-
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]) { "_id": "oldtoolbag.com", "num_tutorial": 2 } { "_id": "Neo4j", "num_tutorial": 1 } >
Die SQL-Äquivalentabfrage für den obigen Fall wird select by_user, count(*) from mycol group by by_user.
In dem obigen Beispiel haben wir nach dem Feldby_userDie Dokumente wurden gruppiert, und bei jeder Gruppierung nach Benutzer wird der vorherige Summenwert erhöht. Hier ist eine Liste der verfügbaren Aggregationsausdrücke.
Ausdruck | Beschreibung | Beispiel |
---|---|---|
$sum | Den Gesamtwert berechnen. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | Den Durchschnittswert berechnen | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | Den kleinsten Wert der entsprechenden Werte aller Dokumente in der Sammlung erhalten. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | Den größten Wert der entsprechenden Werte aller Dokumente in der Sammlung erhalten. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | In dem Ergebnisdokument wird ein Wert in ein Array eingefügt. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其他的文档。
这里我们介绍一下聚合框架中常用的几个操作:
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
1、$project 实例
db.article.aggregate( { $project : { }} title : 1 , author : 1 , }} );
这样结果中就只还剩下_id, title和author三个字段了,默认情况下_id字段是被包含的,如果不想包含_id的话可以这样:
db.article.aggregate( { $project : { }} _id : 0 , title : 1 , author : 1 }});
2$match-Beispiel
db.articles.aggregate( [ { $match : { score : { $gt : 70, $lte : 90 } } }, { $group: { _id: null, count: { $sum: 1 } } } ] );
$match zum Erhalten von Dokumenten mit einer Bewertung größer als70 ist kleiner oder gleich90 Aufzeichnungen, dann werden die zutreffenden Aufzeichnungen an den nächsten Pipeline-Operator $group weitergeleitet.
3$skip-Beispiel
db.article.aggregate( { $skip : 5 });
Nach der Verarbeitung durch den Pipeline-Operator $skip werden die ersten fünf Dokumente "gefiltert".