MongoDB:如何使用$group聚合来获取使用类似字段的所有数据?

MongoDB:如何使用$group聚合来获取使用类似字段的所有数据?,mongodb,mgo,Mongodb,Mgo,我正在尝试使用golang mgo执行查询,以有效地从联接中获取类似的值。 我的结构是这样的: result: [ { "_id" : 1, "booking_id" : 96, "provider_id" : 20, "time" : NumberLong(1541158790), "arrival_time" : NumberLong(1541158863) }, { "

我正在尝试使用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",
    }
] 
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的数据进行分组,现在如何使用$group AGGRATION获取simlilar预订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返回此集合的结果,如下所示:

 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",
    }
] 
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$组聚合??或者,如果没有,我如何在mongodb中使用用于golang的mgo包实现这一点。

您可以使用$group和,它引用当前正在处理的文档。 您的聚合类似于:

{ 
    $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\u id
provider\u 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),
      },
    ]
 }
],
...
您可以使用$group和,它引用管道中当前正在处理的文档。 您的聚合类似于:

{ 
    $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\u id
provider\u 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),
      },
    ]
 }
],
...

你到底试过什么?这是很有可能的,如果不是以您正在演示的方式完全符合预期的输出,因为预期的输出格式实际上是无效的。
$push
操作符可用于创建与特定分组键相关的数据数组,并且有很多方法。在这里询问有关更改尝试代码的“问题”是可以的。但是,强烈反对直接提出“请为我编写代码!”的问题,这些问题的结束是有充分理由的。我还提到了用于返回分组输出的函数查询。但它不返回任何值。奇怪的是,你的结果似乎不是来自分组操作,因为它有不同的属性。如何准确地打印输出?在输出中,它显示响应结构中提到的结果属性。这里的结果是响应结构的类型。但是为什么它不显示分组操作的输出呢?这里的结果是response类型,具有上面提到的所有字段。{pipe.all(&result)}如果我得到了response的所有结果,那么对我来说就没问题了。但我希望结果按预订id分组。为此,我使用$group聚合。但它似乎有一些问题,因为它没有给我任何输出。你到底尝试了什么?这是很有可能的,如果不是以您正在演示的方式完全符合预期的输出,因为预期的输出格式实际上是无效的。
$push
操作符可用于创建与特定分组键相关的数据数组,并且有很多方法。在这里询问有关更改尝试代码的“问题”是可以的。但是,强烈反对直接提出“请为我编写代码!”的问题,这些问题的结束是有充分理由的。我还提到了用于返回分组输出的函数查询。但它不返回任何值。奇怪的是,你的结果似乎不是来自分组操作,因为它有不同的属性。如何准确地打印输出?在输出中,它显示响应结构中提到的结果属性。这里的结果是响应结构的类型。但是为什么它不显示分组操作的输出呢?这里的结果是response类型,具有上面提到的所有字段。{pipe.all(&result)}如果我得到了response的所有结果,那么对我来说就没问题了。但我希望结果按预订id分组。为此,我使用$group聚合。但它似乎有一些问题,因为它没有给我任何输出。如果我同时使用$group和$$ROOT,它会给我相同的结果,但我还希望provider_id位于items数组之外。{“_id”:95,“provider_id”:20,“items”:[]}当我使用$$ROOT时是否可能,因为我使用$push累加器将provider_id推到$$ROOT之前,但它在“items”中包含provider_id。如果我同时使用$group和$$ROOT,它会为我提供相同的结果,但我还希望provider_id位于items数组之外。{“_id”:95,“provider_id”:20,“items”:[]}当我使用$$ROOT时是否可能,因为我使用$push累加器将provider_id推到$$ROOT之前,但它在“items”中包含provider_id