MongoDB: Как использовать агрегацию $ group для получения всех данных с использованием аналогичного поля? - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь выполнить запрос, используя 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. Я хочу получить данные в следующей структуре: *

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
    }
]

Здесь я упоминаю только два идентификатора бронирования, в моей базе данных 1000 записей идентификаторов бронирования. Я хочу показать данные, сгруппированные по идентификатору бронирования. Возможно ли использовать агрегацию mongodb $ group ?? Или, если нет, то как мне добиться этого в mongodb, используя пакет mgo для golang.

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете использовать $ 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),
      },
    ]
 }
],
...
...