MongoDB: 如何使用 $group 聚合来获取所有使用相似字段的数据?
MongoDB: How To use $group aggregation to get all data using similar field?
我正在尝试使用 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 aggregation.I 获得类似预订 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)
但它将return输出给我:
[
{
"id": 0,
"booking_id": 0,
"provider_id": 0
}
]
这里我只提到两个预订id数据,我的数据库中有1000条预订id记录。
我想显示按预订 ID 分组的数据,是否可以使用 mongodb $group 聚合?或者,如果没有,那么我如何在 mongodb 中使用 golang 的 mgo 包来实现这一点。
您可以使用 $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),
},
]
}
],
...
我正在尝试使用 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 aggregation.I 获得类似预订 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)
但它将return输出给我:
[
{
"id": 0,
"booking_id": 0,
"provider_id": 0
}
]
这里我只提到两个预订id数据,我的数据库中有1000条预订id记录。 我想显示按预订 ID 分组的数据,是否可以使用 mongodb $group 聚合?或者,如果没有,那么我如何在 mongodb 中使用 golang 的 mgo 包来实现这一点。
您可以使用 $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),
},
]
}
],
...