我在数据库中有一个收集消息。
要显示集合结构,我使用此命令。
db.messages.findOne()
{
"_id" : ObjectId("4f16fc97d1e2d32371003f02"),
"body" : "COURTYARD\n\nMESQUITE\n2300 HWY 67\nMESQUITE, TX 75150\ntel: 972-681-3300\nfax: 972-681-3324\n\nHotel Information: http://courtyard.com/DALCM\n\n\nARRIVAL CONFIRMATION:\n Confirmation Number:84029698\nGuests in Room: 2\nNAME: MR ERIC BASS \nGuest Phone: 7138530977\nNumber of Rooms:1\nArrive: Oct 6 2001\nDepart: Oct 7 2001\nRoom Type: ROOM - QUALITY\nGuarantee Method:\n Credit card guarantee\nCANCELLATION PERMITTED-BEFORE 1800 DAY OF ARRIVAL\n\nRATE INFORMATION:\nRate(s) Quoted in: US DOLLAR\nArrival Date: Oct 6 2001\nRoom Rate: 62.10 per night. Plus tax when applicable\nRate Program: AAA AMERICAN AUTO ASSN\n\nSPECIAL REQUEST:\n NON-SMOKING ROOM, GUARANTEED\n \n\n\nPLEASE DO NOT REPLY TO THIS EMAIL \nAny Inquiries Please call 1-800-321-2211 or your local\ninternational toll free number.\n \nConfirmation Sent: Mon Jul 30 18:19:39 2001\n\nLegal Disclaimer:\nThis confirmation notice has been transmitted to you by electronic\nmail for your convenience. Marriott's record of this confirmation\nnotice is the official record of this reservation. Subsequent\nalterations to this electronic message after its transmission\nwill be disregarded.\n\nMarriott is pleased to announce that High Speed Internet Access is\nbeing rolled out in all Marriott hotel brands around the world.\nTo learn more or to find out whether your hotel has the service\navailable, please visit Marriott.com.\n\nEarn points toward free vacations, or frequent flyer miles\nfor every stay you make! Just provide your Marriott Rewards\nmembership number at check in. Not yet a member? Join for free at\nhttps://member.marriottrewards.com/Enrollments/enroll.asp?source=MCRE\n\n",
"filename" : "2.",
"headers" : {
"Content-Transfer-Encoding" : "7bit",
"Content-Type" : "text/plain; charset=us-ascii",
"Date" : ISODate("2001-07-30T22:19:40Z"),
"From" : "reservations@marriott.com",
"Message-ID" : "<32788362.1075840323896.JavaMail.evans@thyme>",
"Mime-Version" : "1.0",
"Subject" : "84029698 Marriott Reservation Confirmation Number",
"To" : [
"ebass@enron.com"
],
"X-FileName" : "eric bass 6-25-02.PST",
"X-Folder" : "\\ExMerge - Bass, Eric\\Personal",
"X-From" : "Reservations@Marriott.com",
"X-Origin" : "BASS-E",
"X-To" : "EBASS@ENRON.COM",
"X-bcc" : "",
"X-cc" : ""
},
"mailbox" : "bass-e",
"subFolder" : "personal"
}
我需要从'和'到'得到对'的结果。为此,我使用aggregate命令。首先,我使用{"$unwind": "$headers.To"}
取消组合来自数组headers.to的所有电子邮件。比我使用$ group部分来分组我的结果。
我使用此查询:
db.messages.aggregate([{"$unwind": "$headers.To"},
{"$group": { "_id":null, 'From': "$headers.From", 'To': "$headers.To","count":{$sum:1}}},
{"$sort": {"count": -1}},
{"$limit": 10},
])
错误讯息:
assert: command failed: {
"ok" : 0,
"errmsg" : "the group aggregate field 'From' must be defined as an expression inside an object",
"code" : 15951
} : aggregate failed
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:13:14
assert.commandWorked@src/mongo/shell/assert.js:287:5
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1312:5
@(shell):1:1
2016-11-24T20:07:50.827+0200 E QUERY [thread1] Error: command failed: {
"ok" : 0,
"errmsg" : "the group aggregate field 'From' must be defined as an expression inside an object",
"code" : 15951
} : aggregate failed :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:13:14
assert.commandWorked@src/mongo/shell/assert.js:287:5
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1312:5
@(shell):1:1
我做错了什么?
答案 0 :(得分:17)
你想要实现的目标 - 假设你想要分组来自&amp; to - 可以使用以下group
:
{"$group": { "_id": {'From': "$headers.From", 'To': "$headers.To"}, "count": {$sum:1}}}
参考文献:
$ group
按一些指定的表达式对文档进行分组,并为每个不同的分组输出到下一个阶段的文档。输出文档包含一个_id字段,该字段按键包含不同的组。输出文档还可以包含计算字段,其中包含按$ group的_id字段分组的某些累加器表达式的值
累加器表达式是表达式,例如min
,max
(每组),sum
(正如您所使用的),数组表达式(由{{1}指定}和push
)和其他人。
具体来说,错误消息指出您必须使用上述表达式之一作为addToSet
字段的值。
如果你不喜欢Form
和From
&#34;挤压&#34;在To
内,您可以稍后通过添加_id
阶段来消费它。