我正在尝试使用golang mgo执行查询,以有效地从联接中获取相似的值。
我的结构是这样的:
result: [
{
"_id" : 1,
"booking_id" : 96,
"provider_id" : 20,
"time" : NumberLong(1541158790),
"arrival_time" : NumberLong(1541158863)
},
{
"_id" : 3,
"booking_id" : 96,
"provider_id" : 20,
"time" : NumberLong(1541158908),
},
{
"_id" : 4,
"booking_id" : 95,
"provider_id" : 20,
"type" : "abc",
"time" : NumberLong(1541163544),
"location" : {
"lat" : 30.711858,
"lng" : 76.729649
},
},
{
"_id" : 8,
"booking_id" : 95,
"provider_id" : 20,
"type" : "aaa",
}
]
我必须将相似的booking_id的数据分组,现在如何使用$ group聚合获取类似的预订ID的数据。我想要以下结构的数据:
result: [
0:[
{
"_id" : 1,
"booking_id" : 96,
"provider_id" : 20,
"time" : NumberLong(1541158790),
"arrival_time" : NumberLong(1541158863)
},
{
"_id" : 3,
"booking_id" : 96,
"provider_id" : 20,
"time" : NumberLong(1541158908),
},
],
1:[
{
"_id" : 4,
"booking_id" : 95,
"provider_id" : 20,
"type" : "abc",
"time" : NumberLong(1541163544),
"location" : {
"lat" : 30.711858,
"lng" : 76.729649
},
},
{
"_id" : 8,
"booking_id" : 95,
"provider_id" : 20,
"type" : "aaa",
}
]
]
我创建了一个函数,该函数将重现此集合的结果并使用$ group这样:
query := []bson.M{
{"$group": bson.M{
"_id": bson.M{"booking_id": "$booking_id"},
"count": bson.M{"$sum": 1}}}}
pipe := getCollection.Pipe(query)
err = pipe.All(&result)
但是它将返回此输出给我:
[
{
"id": 0,
"booking_id": 0,
"provider_id": 0
}
]
这里我仅提及两个预订ID数据,我的数据库中有1000个预订ID记录。 我想显示按预订ID分组的数据,可以使用mongodb $ group聚合吗?否则,我该如何使用gogo的mgo包在mongodb中实现此目的。
答案 0 :(得分:2)
您可以使用$ group和$$ROOT,它们引用管道中当前正在处理的文档。 您的汇总将类似于:
{
$group: {
_id: '$booking_id',
items: {
$push: '$$ROOT'
}
}
}
这将导致以下结果:
[
{
"_id": 95,
"items": [
{
"_id" : 1,
"booking_id" : 96,
"provider_id" : 20,
"time" : NumberLong(1541158790),
"arrival_time" : NumberLong(1541158863)
},
{
"_id" : 3,
"booking_id" : 96,
"provider_id" : 20,
"time" : NumberLong(1541158908),
},
]
}
],
...
编辑:
如果要同时显示booking_id
和provider_id
,则可以按这两个字段分组并按所需方式投影数据。像这样:
[
{
$group: {
_id: { 'booking_id': '$booking_id', 'provider_id': '$provider_id' },
items: { $push: '$$ROOT' }
}
},
{
$project: {
_id: 0,
booking_id: '$_id.booking_id',
provider_id: '$_id.provider_id',
items: 1
}
}
]
提供此结构:
[
{
"booking_id": 96,
"provider_id": 20,
"items": [
{
"_id" : 1,
"booking_id" : 96,
"provider_id" : 20,
"time" : NumberLong(1541158790),
"arrival_time" : NumberLong(1541158863)
},
{
"_id" : 3,
"booking_id" : 96,
"provider_id" : 20,
"time" : NumberLong(1541158908),
},
]
}
],
...