MongoDB项目在数组中添加额外字段

时间:2015-11-05 15:01:42

标签: mongodb

我首先要说的是我没有使用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()但是这对分片集合不起作用(我使用的集合是分片的)

有人能帮助我吗?

1 个答案:

答案 0 :(得分:2)

$group管道阶段的聚合错误。小组阶段根据您的规则组装新文档,然后将它们传递到下一个阶段。您只需定义_id和测量值;这就是你无法在投影舞台上访问questid的原因。

您必须添加逻辑来处理甚至可能在组阶段添加questid。然后,您可以在投影舞台上使用它。

关于您的作业,我认为您应该对文档进行分组,然后使用cacheid和questid作为复合键。小组赛阶段就是这样的事情:

'_id': {cacheid: '$cache.cacheid', questid: '$questid'}