我首先要说的是我没有使用MongoDB的经验。我对SQL和关系数据库很有经验,但这整个MongoDB对我来说是全新的。不过,我们需要将它用于学校作业,但我根本无法解决这个问题。
我有一个名为" quests"的文档集,如下所示:
{
"_id" : ObjectId("563b59f8da33f3593f29a3c6"),
"questid" : 1,
"userid" : "BillKellock@excite.us",
"cache" : {
"cacheid" : 1,
"latitude" : 50.8921231431384200,
"longitude" : 4.4543394886210281
},
"measurements" : [
{
"timestamp" : "2015-11-05T14:21:55.0980113+01:00",
"heartrate" : 70,
"pressure" : 1026,
"temperature" : null,
"conductivity" : 3371,
"latitude" : 50.4533254161725400,
"longitude" : 4.1293538055053700
},
{
"timestamp" : "2015-11-05T14:21:55.0990122+01:00",
"heartrate" : null,
"pressure" : 947,
"temperature" : 277,
"conductivity" : 3918,
"latitude" : 50.9827324962163000,
"longitude" : 4.7924412785994086
},
...
]
},
{
"_id" : ObjectId("563b59f8da33f3593f29a3ce"),
"questid" : 2,
...
我需要做的是获得由cacheid和questid分组/排序的测量的概述。在这方面,作业并不十分明确,我不知道是否需要对它们进行分组或只是对它们进行排序。无论如何,我尝试通过cacheid对测量进行分组,然后想要将问题添加到测量中,以便我可以根据该字段进行排序。
到目前为止我构建的查询是这样的:
db.quests.aggregate(
[
{ $unwind: "$measurements" },
{ $group:
{
_id:"$cache.cacheid",
measurements: { $push: "$measurements" }
}
},
{
$project:
{
"measurements.timestamp": 1,
"measurements.heartrate": 1,
"measurements.pressure": 1,
"measurements.temperature": 1,
"measurements.conductivity": 1,
"measurements.latitude": 1,
"measurements.longitude": 1,
"measurements.questid": "$questid",
}
}
]
)
这给了我按cacheid分组的测量值(显示为_id)。但是,测量阵列中没有问题的迹象。我不知道如何添加"在那里,广泛的谷歌搜索对我没有帮助。
我确实找到.group()但是这对分片集合不起作用(我使用的集合是分片的)
有人能帮助我吗?
答案 0 :(得分:2)
$group
管道阶段的聚合错误。小组阶段根据您的规则组装新文档,然后将它们传递到下一个阶段。您只需定义_id
和测量值;这就是你无法在投影舞台上访问questid
的原因。
您必须添加逻辑来处理甚至可能在组阶段添加questid
。然后,您可以在投影舞台上使用它。
关于您的作业,我认为您应该对文档进行分组,然后使用cacheid和questid作为复合键。小组赛阶段就是这样的事情:
'_id': {cacheid: '$cache.cacheid', questid: '$questid'}