获取投影中数组的第一个值,使用$ addToSet mongodb创建的数组?

时间:2014-06-11 07:22:39

标签: javascript mongodb aggregation-framework

他们以任何方式只获取数组的第一个元素,使用$ addToSet在$ group聚合管道中创建数组

我的聚合查询如下:

db.event.aggregate([
{
$group:
    {
        _id:{"City":"$TracInfo.City"},
        "EventCount":{"$sum":1},
        "Latitude":{"$addToSet":"$TracInfo.Longitude"},
        "Longitude":{"$addToSet":"$TracInfo.Latitude"}
    } 
},
{
$project:
    {
        "_id":"$_id.City",
        "EventCount":"$EventCount",
        "Latitude":"$Latitude",
        "Longitude":"$Longitude"
    }
}]).pretty()

这里为Latitude,Longitude我得到一个数组。我只想在每个地图上显示一个城市的单个值。

我在$ Latitude和$ Longitude上尝试了$ max。

错误:"例外:无效的运营商' $ max'", 我甚至试过pop

"Latitude":{"$pop":{"$Latitude":-1}}

错误:"例外:无效的运营商' $ pop'"

谢谢!!提前

2 个答案:

答案 0 :(得分:1)

如果您不关心自己将要获得的订单或价值,则应使用$first运营商。它将返回group操作中匹配的第一个值。

$group:
    {
        _id:{"City":"$TracInfo.City"},
        "EventCount":{"$sum":1},
        "Latitude":{"$first":"$TracInfo.Longitude"},
        "Longitude":{"$first":"$TracInfo.Latitude"}
    } 
}

答案 1 :(得分:1)

在执行任何操作(例如获取第一个项目)之前,您基本上需要 $unwind 数组。但另一个问题是 $addToSet 不保持结果的顺序,因此第一项不一定是“最高”或“最低”,您需要 $sort

或者只使用 $first

db.event.aggregate([
    { "$group": {
        "_id": "$TracInfo.City"
        "EventCount":{"$sum":1},
        "Latitude":{"$addToSet":"$TracInfo.Longitude"},
        "Longitude":{"$addToSet":"$TracInfo.Latitude"}
    }},
    { "$unwind": "$Longitude" },
    { "$group": {
        "_id": "$_id",
        "EventCount":{"$first": "$EventCount"},
        "Latitude":{ "$first": "$Latitude" },
        "Longitude":{ "$first": "$Longtitude" }
    }},
    { "$unwind": "$Latitude" },
    { "$group": {
        "_id": "$_id",
        "EventCount":{"$first": "$EventCount"},
        "Latitude":{ "$first": "$Latitude" },
        "Longitude":{ "$first": "$Longtitude" }
    }}
])

在缩小为“设置”后,您可以获得结果。

或订购:

db.event.aggregate([
    { "$group": {
        "_id": "$TracInfo.City"
        "EventCount":{"$sum":1},
        "Latitude":{"$addToSet":"$TracInfo.Longitude"},
        "Longitude":{"$addToSet":"$TracInfo.Latitude"}
    }},
    { "$unwind": "$Longitude" },
    { "$sort": { "_id": 1, "Longtitude": 1 },
    { "$group": {
        "_id": "$_id",
        "EventCount":{"$first": "$EventCount"},
        "Latitude":{ "$first": "$Latitude" },
        "Longitude":{ "$first": "$Longtitude" }
    }},
    { "$unwind": "$Latitude" },
    { "$sort": { "_id": 1, "Latitude": 1 },
    { "$group": {
        "_id": "$_id",
        "EventCount":{"$first": "$EventCount"},
        "Latitude":{ "$first": "$Latitude" },
        "Longitude":{ "$first": "$Longtitude" }
    }}
])

我还假设您打算交换这些字段的值。