【发布时间】:2017-03-18 08:48:30
【问题描述】:
我正在尝试使用大型 mongoDB 自学 mongoDb(每个文档大约 10Mb,总共 1000 个文档)
我想尝试一些基础知识。例如,列出所有用户完成的每个活动,按 UsedCallories 对其进行排序。
db.getCollection('users').aggregate([
{$group: {_id:"$Activities"}},
{$sort: { UsedCallories: -1}}
],{allowDiskUse:true});
不幸的是,当我执行此脚本时,它给了我:'脚本已成功执行,但没有结果可显示。'?
你能指出我错在哪里吗?
缩短的示例文件:
{
"Id": 1,
"FirstName": "Casie",
"LastName": "Crapo",
"Email": "Casie.Crapo@databanken.db",
"Weight": 92,
"Length": 198,
"Activities": [
{
"ActivityType": {
"Name": "Sexual Activity",
"CallPerSecond": 0.033333333
},
"StartCoordinates": {
"Lattidude": -10.81907,
"Longitude": -16.16832
},
"EndCoordinates": {
"Lattidude": -10.81907,
"Longitude": -16.16832
},
"StartDateTime": { $date: "2016-11-01T23:39:15Z" },
"EndDateTime": { $date: "2016-11-02T02:38:45Z" },
"UsedCallories": 772.63042705630426,
"Measurements": [
{
"Heartrate": 142,
"UnderPressure": 123,
"Overressure": 156,
"Speed": 0,
"Coordinates": {
"Lattidude": -10.81907,
"Longitude": -16.16832
}
}
]
}
]
}
更新“预期输出”:
因此,预期的输出只是用户的所有数组字段中所有活动的列表。按 UsedCallories 排序。
"Activities": [
{
"ActivityType": {
"Name": "Sexual Activity",
"CallPerSecond": 0.033333333
},
"StartCoordinates": {
"Lattidude": -10.81907,
"Longitude": -16.16832
},
"EndCoordinates": {
"Lattidude": -10.81907,
"Longitude": -16.16832
},
"StartDateTime": { $date: "2016-11-01T23:39:15Z" },
"EndDateTime": { $date: "2016-11-02T02:38:45Z" },
"UsedCallories": 772.63042705630426,
"Measurements": [
...
]
},{
"ActivityType": {
"Name": "Sexual Activity",
"CallPerSecond": 0.033333333
},
"StartCoordinates": {
"Lattidude": -10.81907,
"Longitude": -16.16832
},
"EndCoordinates": {
"Lattidude": -10.81907,
"Longitude": -16.16832
},
"StartDateTime": { $date: "2016-11-01T23:39:15Z" },
"EndDateTime": { $date: "2016-11-02T02:38:45Z" },
"UsedCallories": 52.63042705630426,
"Measurements": [
...
]
},{
"ActivityType": {
"Name": "Sexual Activity",
"CallPerSecond": 0.033333333
},
"StartCoordinates": {
"Lattidude": -10.81907,
"Longitude": -16.16832
},
"EndCoordinates": {
"Lattidude": -10.81907,
"Longitude": -16.16832
},
"StartDateTime": { $date: "2016-11-01T23:39:15Z" },
"EndDateTime": { $date: "2016-11-02T02:38:45Z" },
"UsedCallories": 20.22442,
"Measurements": [
...
]
}
]
重复问题后更新
好的,感谢您对重复帖子的引用。不过,这不是同一个问题。
我设法使用其中的一些来实际获得一些结果。 查询更改为:
db.getCollection('users').aggregate([
{$unwind: '$Activities'},
{$sort: {'Activities.UsedCallories': -1}},
{$group: {_id: '$_id', 'Activities': {$push: '$Activities'}}}
], {
allowDiskUse:true
})
Wich 现在返回按用户分组的所有活动,我希望只列出所有这些未按用户分组的活动的列表
【问题讨论】:
-
在分组前尝试管道中的 {$unwind: "$Activities"} 步骤。
-
@Veeram 我试过了,它仍然给出了同样的信息。
db.getCollection('users').aggregate([ {$unwind: "$Activities"}, {$group: {_id: "$Activities"}}, { $sort : { UsedCallories : -1 } }], { allowDiskUse:true }) -
@chridam 这是骗子吗?看起来用户不想按任何 ID 对其进行分组。他只需要将所有活动提取到结果集中并进行排序。
-
@Veeram 在 OP 更新他们的问题以反映对“欺骗”所做的更改后,我已经撤回了。底线是他们可以使用 fianl
$project管道仅返回活动列表或另一个_id值为null的$group阶段将所有子文档分组为一个整体。 -
@Kieken72 我将作为评论添加。 db.getCollection('users').aggregate([ {$unwind: "$Activities"}, {$sort: { 'Activities.UsedCallories': -1}}, {$group: {_id : null, 活动: { $push: "$Activities" }}}, {$project:{_id:0,Activities:1}} ],{allowDiskUse:true});
标签: mongodb aggregation-framework robo3t