2016-07-19 5 views
2

mongodbデータベースを使用してgolangで再作成しようとしているSQL文があります。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からわかるように、最初の合計/カウントで私が何をしているかを示しています。私はまた別のフィールド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 
    } 

ように私は、$指揮のあなたが前にガイダンスを提供する文や$やコマンドを使用して巣にそれを取るしようとしています私は以下を行うことができます:

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

私はb

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

ただし、構文が正確ではありません。私はそれがこのようなものに従うべきであると考えているが、指導のために再び

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

感謝を正確に(下の別のstackoverflowのスレッドからである)、それを翻訳する方法がわかりません!

マップは、マップをアンラップするにはどうすればよい

アンラップ?

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

それは良いですが、使用しているデータ型を理解するためのDBスキーマに関する情報はまだありません。

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

更新:すべてのフィールドは、文字列の形式である場合は、ここの場合のSQLクエリーのモンゴのと等価である

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

ローマン、$と$を含めるように$ condを拡張するための支援をオンラインで探しています。私はそこにあまりにも多くの例を見ていない、あなたはどこを見て正しい方向に私を指摘することができますか?上記で指摘したドキュメントを読みました。私も別のstackoverflowスレッドを発見しましたが、bsonのためにフォーマットされていません。私が試したことを示すために新しいスレッドを開始するか、このスレッドを拡張する必要がありますか? – CRob

+0

@CRobここにそれを保存する方が簡単だと思います。また、クエリのSQLバージョンをリンクすることを忘れないでください。最終的な結果が分かりやすくなります。 –