2016-07-19 67 views
2

我有一條SQL語句,我試圖在使用MongoDB數據庫的golang中重新創建。我試圖重新聲明如下:golang mongodb中的Transact-SQL等效集合

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中可以看出,它顯示了我在第一個總和/次數後要做什麼。我還想總結另一個字段是送出並在相同的日期將它們相加,並返回同一天的計數。我可以得到一些關於我如何完成這項任務的方向?

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

Schema定義

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) 

我b een玩以下內容:

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

但不確定的語法。我相信它應該遵循這樣的事情,但不會再知道如何它到底(下面是從另一個計算器線程)翻譯

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

感謝您的指導!

解纏地圖

你如何解開地圖?

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

檢索值。我試過以下,但它返回null。

fmt.Printf("%s\n", resultRec["_id.date"]) 
+0

有你甚至試圖讀取[MongoDB的聚合框架文件(HTTPS: //docs.mongodb.com/manual/aggregation/)在提問之前?順便說一句,NoSQL並不意味着我們不需要關於文檔結構的信息。 –

+0

是的,我確實閱讀了文檔,但仍然遇到問題,因此我發佈了該問題。這應該是我們在遇到問題時得到幫助的地方。 – CRob

+0

我在這裏看不到問題。問題是當你試圖做某件事情時,你的嘗試結果不起作用。問題是,當你不明白事情是如何工作的,而這件事情沒有記錄。就你而言,我所看到的只是爲你免費爲你做一些工作的請求,而不需要你方的任何努力來自己解決。當然,除了寫這篇文章外。向我們展示您嘗試過的查詢/代碼,我們會看到它有什麼問題。 –

回答

0

好的。這樣更好,但仍然沒有關於數據庫模式的信息來了解您正在使用的數據類型。這裏是蒙戈的相當於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}, 
      }, 
     }, 
    ) 
+0

這是非常有用的,我想投票你的答案,但不能由於我的名譽太低。否則,它肯定會完成。 – CRob

+0

Roman,我在網上尋找幫助擴展$ cond以包括$和。我沒有看到太多的例子,你能指出我在哪裏尋找正確的方向?我閱讀了上面指出的文檔。我還發現了另一個stackoverflow線程,但它沒有爲bson格式化。我應該開始一個新的線程來展示我嘗試過的東西,還是擴展這個東西? – CRob

+0

@CROB我認爲將會更容易保留在這裏。並且不要忘記鏈接SQL版本的查詢,因爲它更容易理解您期待的最終結果。 –