Эквивалент Transact-SQL в агрегате golang mongodb

mongodb go aggregation-framework

262 просмотра

1 ответ

13 Репутация автора

У меня есть оператор SQL, который я пытаюсь воссоздать на Голанге, используя базу данных mongodb. Утверждение, которое я пытаюсь воссоздать, заключается в следующем:

select date,
       sum(case when field1 = "true" then 1 else 0) trueField1,
       sum(case when field1 = "false" then 1 else 0) falseField1,
       sum(case when field2 = "true" then 1 else 0) trueField2,
       sum(case when field2 = "false" then 1 else 0) falseField2
from myTable
group by date

Мне нужно подсчитать несколько комбинаций за определенную дату и вывести их, но я не уверен, как это сделать с помощью golang / mongodb.

Отредактировано: вот отправная точка, которая у меня есть для последнего запроса. как видно из o1, он показывает, что я собираюсь получить по первой сумме / счету. Я также хотел бы суммировать другое поле isDelivered и суммировать их в тот же день, возвращая счет за тот же день. Могу ли я получить какое-то руководство о том, как я мог бы выполнить эту задачу?

    o1 := bson.M{
        "$match" : bson.M {
            "retailer" : clientId,
            "isComplete" : true,
            "pkgStatus.finalized" : true,
            },
    }

    o2 := bson.M {
        "$project" : bson.M {
            "_id" : 1,
            "createdAt" : 1,
        },
    }

    o3 := bson.M{
        "$group": bson.M{
            "_id" : bson.M{ "$dayOfYear": "$createdAt" },
            "total" : bson.M{ "$sum" : 1},
            "first" : bson.M{ "$min" : "$createdAt" },
        },
    }

    o4 := bson.M {
        "$sort" : bson.M { "_id" : 1 },
    }

    totalMessages := []bson.M{msgsStarted, o2, o3, o4}

    operations := []bson.M{o1, o2, o3, o4}

    pipe := cMessages.Pipe(operations)

    results := []bson.M{}
    err := pipe.All(&results)

    if err != nil {
        fmt.Printf("Error: %s\n", err)
        return
    }

    for _, resultRec := range results {
        myDate := fmt.Sprintf("%s", resultRec["first"])
        fmt.Printf("%s, %d\n", myDate[0:10], resultRec["total"])
    }

EDIT2

Определение схемы

messages {
  "_id" : {
    "$oid" : bson.ObjectId
  },
  "isComplete" : bool,
  "status" : {
    "cancelled" : bool,
    "finalized" : bool,
    "delivered" : bool
  },
  "createdDate" : {
    "$date" : ISODate
  } 

Я пытаюсь взять операторы $ cond, которые вы предоставили ранее, и вложить их с помощью команды $ и, чтобы я мог сделать следующее:

sum(case when isComplete = true and status.finalized = true then 1 else 0)

Я играл со следующим:

tf1c := bson.M{"$cond": []interface{}{bson.M{"$eq": []interface{}{"iscomplete", true}}, 1, 0}}

но точно не уверен в синтаксисе. Я полагаю, что это должно следовать как-то так, но не уверен, как именно это перевести (ниже - из другого потока stackoverflow)

"$cond": [{
    "$and": [{
      "$eq": ["isComplete", true]
    }, {
      "$eq": ["pkgStatus.finalized", true]
    }]
}, 1, 0]

Еще раз спасибо за руководство!

Развертывание карты

Как вы разворачиваете карту?

map[_id:map[date:2014-12-25 retailer:ObjectIdHex("548a9de8a4ea9d690f6df8e4")]] 

чтобы получить значения. Я пробовал следующее, но он возвращает ноль.

fmt.Printf("%s\n", resultRec["_id.date"])
Автор: CRob Источник Размещён: 19.07.2016 04:49

Ответы (1)


0 плюса

3000 Репутация автора

Решение

Хорошо. Это лучше, но по-прежнему нет информации о вашей схеме БД, чтобы понять, какие типы данных вы используете. Вот монго-эквивалент SQL-запроса в случае, если все поля имеют строковый формат:

package main

import (
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
    "fmt"
)

func main() {
    session, err := mgo.Dial("mongodb://127.0.0.1:27017/db")

    if err != nil {
        panic(err)
    }
    defer session.Close()
    session.SetMode(mgo.Monotonic, true)

    db := session.DB("db")
    c := db.C("MyTable")

    tf1c := bson.M{"$cond": []interface{}{bson.M{"$eq": []interface{}{"$field1", "true"}}, 1, 0}}
    ff1c := bson.M{"$cond": []interface{}{bson.M{"$eq": []interface{}{"$field1", "false"}}, 1, 0}}
    tf2c := bson.M{"$cond": []interface{}{bson.M{"$eq": []interface{}{"$field2", "true"}}, 1, 0}}
    ff2c := bson.M{"$cond": []interface{}{bson.M{"$eq": []interface{}{"$field2", "false"}}, 1, 0}}

    pipe := c.Pipe(
        []bson.M{
            bson.M{
                "$group": bson.M{
                    "_id": "$date",
                    "trueField1": bson.M{"$sum": tf1c},
                    "falseField1": bson.M{"$sum": ff1c},
                    "trueField2": bson.M{"$sum": tf2c},
                    "falseField2": bson.M{"$sum": ff2c},
                },
            },
            bson.M{
                "$sort": bson.M{"_id": -1},
            },
        },
    )
    result := []bson.M{}
    err = pipe.All(&result)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%+v", result)
}

Обновление :

pipe := c.Pipe(
        []bson.M{
            bson.M{
                "$project": bson.M{
                    "year": bson.M{"$year": "$createdDate"},
                    "month": bson.M{"$month": "$createdDate"},
                    "day": bson.M{"$dayOfMonth": "$createdDate"},
                    "val": bson.M{"$cond":[]interface{}{
                        bson.M{
                            "$and": []interface{}{
                                bson.M{"$eq": []interface{}{"$isComplete", true}},
                                bson.M{"$eq": []interface{}{"$status.finalized", true}},
                            },
                        },
                        1,
                        0,
                    }},
                },
            },
            bson.M{
                "$group": bson.M{
                    "_id": bson.M{
                        "$concat": []interface{}{
                            bson.M{"$substr": []interface{}{"$year", 0, -1}},
                            "-",
                            bson.M{"$substr": []interface{}{"$month", 0, -1}},
                            "-",
                            bson.M{"$substr": []interface{}{"$day", 0, -1}},
                        },
                    },
                    "cnt": bson.M{"$sum": "$val"},
                },
            },
            bson.M{
                "$sort": bson.M{"_id": -1},
            },
        },
    )
Автор: CrazyCrow Размещён: 19.07.2016 08:12
Вопросы из категории :
32x32