MongoDB-CN-Manual
搜玢
⌃K

db.collection.aggregate()

圚本页面

定义

  • db.collection. aggregate(管道选项)
    • 计算集合䞭数据的聚合倌或视囟。
参数
类型
描述
pipeline
array
䞀系列数据聚合操䜜或阶段。有关诊细信息请参阅聚合管道运算笊。 圚 version 2.6 䞭曎改该方法仍然可以接受管道阶段䜜䞺单独的 arguments 而䞍是 array 䞭的元玠;䜆是劂果未将pipeline指定䞺 array则无法指定options参数。
options
document
可选的。 aggregate()䌠递给aggregate呜什的其他选项。 version 2.6 䞭的新内容仅圓悚将pipeline指定䞺 array 时才可甚。
options文档可以包含以䞋字段和倌
字段
类型
描述
explain
boolean
可选的。指定 return 有关管道倄理的信息。有关 example请参见返回有关聚合管道操䜜的信息。 version 2.6 䞭的新内容。 圚倚文档亀易䞭䞍可甚。
allowDiskUse
boolean
可选的。允讞写入䞎时文件。讟眮䞺时 true倧倚数聚合操䜜可以将数据写入_tmp目圕䞭的 dbPath子目圕䜆以䞋情况陀倖 $graphLookup]阶段 $addToSet该$group阶段䞭䜿甚的环加噚衚蟟匏 从4.2.3、4.0.14、3.6.17版本匀始 $push该$group阶段䞭䜿甚的环加噚衚蟟匏 从4.2.3、4.0.14、3.6.17版本匀始 有关allowDiskUse的瀺䟋请参见 䜿甚倖郚排序执行倧型排序操䜜。 从MongoDB 4.2匀始事件探查噚日志消息和诊断日志消息包括䞀䞪usedDisk 指瀺笊指瀺是吊有任䜕聚合阶段由于内存限制而将数据写入䞎时文件。
cursor
document
可选的。指定枞标的初始批倄理倧小。 cursor字段的 value 是䞀䞪垊有batchSize字段的文档。有关语法和 example请参阅指定初始批量倧小。 version 2.6 䞭的新内容。
maxTimeMS
non-negative integer
可选的。指定倄理枞标操䜜的 time 限制(以毫秒䞺单䜍)。劂果没有䞺 maxTimeMS 指定 value则操䜜䞍䌚 timeout。 0的 value 星匏指定默讀的无界行䞺。 MongoDB 䜿甚䞎db.killOp()盞同的机制终止超出其分配的 time 限制的操䜜。 MongoDB 仅圚其指定的䞭断点之䞀倄终止操䜜。
bypassDocumentValidation
boolean
可选的。仅圚指定$out或$merge]聚合阶段时可甚。 圚操䜜期闎启甚db.collection.aggregate以绕过文档验证。这䜿悚可以插入䞍笊合验证芁求的文档。 version 3.2 䞭的新内容。
readConcern
document
可选的。指定读关泚。 readConcern 选项具有以䞋语法 圚 version 3.6 䞭曎改。 readConcern: { level: <value> } 可胜的阅读关泚级别䞺 “local”。这是 level 的默讀读取问题。 “available”。圓阅读操䜜和 Causally Consistent Sessions和“level”未指定时这是对二级的读取的默讀倌。查询返回实䟋的最新数据。 “manority”。适甚于䜿甚WiredTiger 存傚匕擎的副本集。 “linerizable”。仅适甚于䞻的读取操䜜。 有关读取关泚级别的曎倚信息请参阅读关泚级别。 从MongoDB 4.2匀始该$out阶段䞍胜䞎读取关泚䞀起䜿甚"linearizable"。也就是诎劂果悚䞺指定了"linearizable"读取关泚 db.collection.aggregate()则䞍胜将$out阶段包括 圚管道䞭。 该$merge阶段䞍胜䞎已关泚的内容䞀起䜿甚"linearizable"。也就是诎劂果悚䞺指定了 "linearizable"读取关泚 db.collection.aggregate()则䞍胜将$merge阶段包括 圚管道䞭。
collation
document
可选的。 指定芁甚于操䜜的敎理。 敎理允讞甚户䞺 string 比蟃指定 language-specific 规则䟋劂字母和重音标记的规则。 排序规则选项具有以䞋语法 排序规则{ locale<string> caseLevel<boolean> caseFirst<string> strength<int> numericOrdering<boolean> alternate<string> maxVariable<string> backwards <boolean> } 指定排序规则时locale字段是必填字段;所有其他校对字段郜是可选的。有关字段的诎明请参阅敎理文件。 劂果未指定排序规则䜆集合具有默讀排序规则(请参阅db.createCollection()则操䜜将䜿甚䞺集合指定的排序规则。 劂果没有䞺集合或操䜜指定排序规则MongoDB 䜿甚先前版本䞭甚于 string 比蟃的简单二进制比蟃。 悚无法䞺操䜜指定倚䞪排序规则。对于 example悚䞍胜䞺每䞪字段指定䞍同的排序规则或者劂果䜿甚排序执行查扟则䞍胜对查扟䜿甚䞀䞪排序规则而对排序䜿甚及䞀䞪排序规则。 version 3.4 䞭的新内容。
hint
string or document
可选的。甚于聚合的玢匕。玢匕䜍于初始 collection/view聚合䞺 run。 通过玢匕 name 或玢匕规范文档指定玢匕。 泚意 hint䞍适甚于$lookup和$graphLookup阶段。 version 3.6 䞭的新内容。
comment
string
可选的。甚户可以指定任意 string 以垮助通过数据库探查噚currentOp 和日志跟螪操䜜。 version 3.6 䞭的新内容。
writeConcern
document
可选的。衚瀺 侎or 阶段䞀起䜿甚的[写关泚点](的文档。$out $merge 応略对$outor $merge阶段䜿甚默讀的写关泚。
返回倌
䞀䞪枞标通过聚合管道操䜜的最后阶段产生的文件或者包括 explain选项提䟛了聚合操䜜的倄理细节的文件。 劂果管道包含$out运算笊则 aggregate()返回䞀䞪空枞标。请参阅 $out以获取曎倚信息。

行䞺

错误倄理

劂果发生错误aggregate()垮助皋序将抛出 exception。

枞标行䞺

圚mongo shell 䞭劂果从db.collection.aggregate()返回的枞标未䜿甚var关键字分配给变量则mongo shell 䌚自劚迭代光标 20 次。请参阅圚 mongo Shell 䞭迭代䞀䞪 Cursor以倄理mongo shell 䞭的枞标。
从聚合返回的枞标仅支持对已评䌰的枞标(已检玢其第䞀批的即枞标)进行操䜜的枞标方法䟋劂以䞋方法
cursor.hasNext() cursor.next() cursor.toArray() cursor.forEach()
cursor.map() cursor.objsLeftInBatch() cursor.itcount() cursor.pretty()
也可以看看
有关曎倚信息请参阅聚合管道聚合参考聚合管道限制和聚合。

䌚话

版本4.0䞭的新功胜。
对于圚䌚话内创建的枞标䞍胜圚getMore䌚话倖调甚 。
同样对于圚䌚话倖郚创建的枞标䞍胜圚getMore䌚话内郚调甚 。

䌚话空闲超时

从MongoDB 3.6匀始MongoDB驱劚皋序和mongoshell皋序将所有操䜜䞎服务噚䌚话盞关联䜆未确讀的写操䜜陀倖。对于未䞎䌚话明确关联的操䜜即䜿甚Mongo.startSession()MongoDB驱劚皋序和mongoshell皋序䌚创建䞀䞪隐匏䌚话并将其䞎该操䜜盞关联。
劂果䌚话空闲时闎超过30分钟则MongoDB服务噚䌚将䌚话标记䞺已过期并可以随时关闭它。圓MongoDB服务噚关闭䌚话时它还䌚终止所有正圚进行的操䜜并打匀䞎该䌚话关联的枞标。这包括配眮了30分钟noCursorTimeout或maxTimeMS30分钟以䞊的光标。
对于返回枞标的操䜜劂果枞标可胜闲眮了30分钟以䞊请圚星匏䌚话䞭䜿甚发出操䜜Session.startSession()并䜿甚refreshSessions呜什定期刷新该䌚话。请参阅 以获取曎倚信息。Session Idle Timeout

事务

db.collection.aggregate()可以圚倚文档事务䞭䜿甚。
䜆是事务䞭䞍允讞以䞋阶段
  • $collStats
  • $currentOp
  • $indexStats
  • $listLocalSessions
  • $listSessions
  • $out
  • $merge
  • $planCacheStats
悚也䞍胜指定该explain选项。
  • 对于圚事务倖郚创建的枞标䞍胜getMore圚事务内郚调甚 。
  • 对于圚事务䞭创建的枞标䞍胜getMore圚事务倖郚调甚 。
重芁
圚倧倚数情况䞋䞎单文档写入盞比倚文档事务产生的性胜成本曎高并䞔倚文档事务的可甚性䞍应替代有效的架构讟计。圚讞倚情况䞋 非规范化数据暡型嵌入匏文档和数组将继续是悚的数据和甚䟋的最䜳选择。也就是诎圚讞倚情况䞋适圓地对数据建暡将最倧皋床地减少对倚文档亀易的需求。
有关其他事务䜿甚方面的泚意事项䟋劂运行时限制和操䜜日志倧小限制及请参见 生产泚意事项。

客户端断匀

对于db.collection.aggregate()䞍包含$out或$merge阶段的操䜜
从MongoDB 4.2匀始劂果发出db.collection.aggregate()断匀连接的客户端圚操䜜完成之前断匀连接则MongoDB将标记db.collection.aggregate()䞺终止即圚操䜜䞊killOp。

䟋子

以䞋瀺䟋䜿甚包含以䞋文档的集合orders
{ _id: 1, cust_id: "abc1", ord_date: ISODate("2012-11-02T17:04:11.102Z"), status: "A", amount: 50 }
{ _id: 2, cust_id: "xyz1", ord_date: ISODate("2013-10-01T17:04:11.102Z"), status: "A", amount: 100 }
{ _id: 3, cust_id: "xyz1", ord_date: ISODate("2013-10-12T17:04:11.102Z"), status: "D", amount: 25 }
{ _id: 4, cust_id: "xyz1", ord_date: ISODate("2013-10-11T17:04:11.102Z"), status: "D", amount: 125 }
{ _id: 5, cust_id: "abc1", ord_date: ISODate("2013-11-12T17:04:11.102Z"), status: "A", amount: 25 }

分组和计算总和

以䞋聚合操䜜选择状态等于"A"的文档按cust_id字段对匹配文档进行分组并从amount字段的总和计算每䞪cust_id字段的total并按降序 order 侭的total字段对结果进行排序
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }
])
该操䜜返回垊有以䞋文档的枞标
{ "_id" : "xyz1", "total" : 100 }
{ "_id" : "abc1", "total" : 75 }
mongo shell 自劚迭代返回的光标以打印结果。有关圚mongo shell 䞭手劚倄理枞标的信息请参阅圚 mongo Shell 䞭迭代䞀䞪 Cursor。

返回有关聚合管道操䜜的信息

以䞋聚合操䜜将选项explain讟眮䞺true以_return 有关聚合操䜜的信息。
db.orders.aggregate(
[
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }
],
{
explain: true
}
)
该操䜜返回垊有文档的枞标该文档包含有关聚合管道倄理的诊细信息。䟋劂陀了其他细节之倖文档可以星瀺所䜿甚的操䜜的玢匕(劂果有的话)。 [1]劂果orders集合是分片集合则文档还将星瀺分片和合并操䜜之闎的分工以及目标查询目标分片。
泚意
explain蟓出文档的预期 readers 是人类而䞍是机噚蟓出栌匏可胜䌚圚䞍同版本之闎发生变化。
mongo shell 自劚迭代返回的光标以打印结果。有关圚mongo shell 䞭手劚倄理枞标的信息请参阅圚 mongo Shell 䞭迭代䞀䞪 Cursor。
[1]玢匕过滀噚䌚圱响所甚玢匕的选择。有关诊细信息请参见玢匕过滀噚。

䜿甚倖郚排序执行倧型排序操䜜

聚合管道阶段有最倧 memory 䜿甚限制。芁倄理倧型数据集请将allowDiskUse选项讟眮䞺true以启甚将数据写入䞎时 files劂䞋面的瀺䟋所瀺
var results = db.stocks.aggregate(
[
{ $project : { cusip: 1, date: 1, price: 1, _id: 0 } },
{ $sort : { cusip : 1, date: 1 } }
],
{
allowDiskUse: true
}
)
从MongoDB 4.2匀始事件profiler log massages和diagnostic log massages包括䞀䞪usedDisk 指瀺笊指瀺是吊有任䜕聚合阶段由于内存限制而将数据写入䞎时文件。

指定初始批量倧小

芁指定枞标的初始批倄理倧小请对cursor选项䜿甚以䞋语法
cursor: { batchSize: <int> }
对于 example以䞋聚合操䜜指定枞标的初始批倄理倧小0
db.orders.aggregate(
[
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } },
{ $limit: 2 }
],
{
cursor: { batchSize: 0 }
}
)
A batchSize 0衚瀺空的第䞀批对于快速返回枞标或倱莥消息而䞍执行重芁的 server-side 工䜜非垞有甚。䞎其他 MongoDB 枞标䞀样将后续批量倧小指定䞺OP_GET_MORE操䜜。
mongo shell 自劚迭代返回的光标以打印结果。有关圚mongo shell 䞭手劚倄理枞标的信息请参阅圚 mongo Shell 䞭迭代䞀䞪 Cursor。

指定排序规则

version 3.4 䞭的新内容。
敎理允讞甚户䞺 string 比蟃指定 language-specific 规则䟋劂字母和重音标记的规则。
集合myColl具有以䞋文档
{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }
以䞋聚合操䜜包括敎理选项
db.myColl.aggregate(
[ { $match: { status: "A" } }, { $group: { _id: "$category", count: { $sum: 1 } } } ],
{ collation: { locale: "fr", strength: 1 } }
);
泚意
劂果执行涉及倚䞪视囟的聚合(䟋劂$lookup或$graphLookup)则视囟必须具有盞同的敎理。
有关園类字段的诎明请参阅敎理文件。

提瀺玢匕

version 3.6 䞭的新内容。
䜿甚以䞋文档创建集合foodColl
db.foodColl.insert([
{ _id: 1, category: "cake", type: "chocolate", qty: 10 },
{ _id: 2, category: "cake", type: "ice cream", qty: 25 },
{ _id: 3, category: "pie", type: "boston cream", qty: 20 },
{ _id: 4, category: "pie", type: "blueberry", qty: 15 }
])
创建以䞋玢匕
db.foodColl.createIndex( { qty: 1, type: 1 } );
db.foodColl.createIndex( { qty: 1, category: 1 } );
以䞋聚合操䜜包括区制䜿甚指定玢匕的hint选项
db.foodColl.aggregate(
[ { $sort: { qty: 1 }}, { $match: { category: "cake", qty: 10 } }, { $sort: { type: -1 } } ],
{ hint: { qty: 1, category: 1 } }
)

芆盖 readConcern

䜿甚该readConcern选项可以指定操䜜的读取关泚点。
悚䞍胜将$out或$merge阶段䞎阅读关泚结合䜿甚"linearizable"。也就是诎劂果悚䞺指定了"linearizable"读取关泚 db.collection.aggregate()则䞍胜圚管道䞭包括任䜕䞀䞪阶段。
对副本集的以䞋操䜜指定“ 读取关泚点”"majority"以读取已确讀已写入倧倚数节点的数据的最新副本。
泚意
  • 芁䜿甚“倚数”的阅读关泚 levelreplica sets 必须䜿甚WiredTiger 存傚匕擎并选䞟protocol version 1。从 MongoDB 3.6 匀始默讀情况䞋启甚对读取问题“倚数”的支持。对于 MongoDB 3.6.1 - 3.6.x悚可以犁甚读取关泚“倚数”。有关曎倚信息请参阅犁甚阅读关泚倚数。
  • 芁确保单䞪线皋可以读取自己的写入请对副本集的䞻芁䜿甚“倚数”读取关泚和“倚数”写入问题。
  • 芁䜿甚“倚数”的阅读关泚 level悚䞍胜包含$out阶段。
  • 无论阅读关泚 level 劂䜕节点䞊的最新数据可胜无法反映系统䞭数据的最新 version。
db.restaurants.aggregate(
[ { $match: { rating: { $lt: 5 } } } ],
{ readConcern: { level: "majority" } }
)

指定 Comment

名䞺movies的集合包含栌匏劂䞋的文档
{
"_id" : ObjectId("599b3b54b8ffff5d1cd323d8"),
"title" : "Jaws",
"year" : 1975,
"imdb" : "tt0073195"
}
以䞋聚合操䜜查扟圚 1995 幎创建的圱片并包含comment选项以圚logsdb.system.profile集合和db.currentOp䞭提䟛跟螪信息。
db.movies.aggregate( [ { $match: { year : 1995 } } ], { comment : "match_all_movies_from_1995" } ).pretty()
圚启甚了性胜分析的系统䞊悚可以查询system.profile集合以查看所有最近的类䌌聚合劂䞋所瀺
db.system.profile.find( { "command.aggregate": "movies", "command.comment" : "match_all_movies_from_1995" } ).sort( { ts : -1 } ).pretty()
这将以䞋列栌匏返回䞀组探查噚结果
{
"op" : "command",
"ns" : "video.movies",
"command" : {
"aggregate" : "movies",
"pipeline" : [
{
"$match" : {
"year" : 1995
}
}
],
"comment" : "match_all_movies_from_1995",
"cursor" : {
},
"$db" : "video"
},
...
}
应甚皋序可以猖码 order 䞭的任意信息以䟿曎蜻束地跟螪或识别系统䞭的特定操䜜。䟋劂application 可胜附加 string comment其䞭包含 process ID线皋 IDclient 䞻机名和发出呜什的甚户。
译者李冠飞
校对