将map [string] interface {}转换为有效的Mongo查询

时间:2017-03-06 23:15:50

标签: mongodb go aggregation-framework bson

我目前正在从有效负载接收mongo聚合查询:

[
  {
    "$match": {
      "isComplete": true
      "accountId": "foo123"
      "startTime": "2017-03-06T23:07:21.262Z"
      "$or": [ { userId: "bar123" }, { userId: "bar235" } ]
    } 
  },
  {
    "$group": {
      "_id": null,
      "count": {
        "$sum": 1
      }
    }
  }
]

将其存储为map[string]interface{}。问题是$match子句可以是任意查询,这意味着它可以包含ObjectIds和Dates。我尝试手动将ID转换为bson.ObejectId s,将任意日期转换为time.Times但查询可能会变得非常复杂。

有没有人知道从有效载荷中获取任意mongo查询并转换它的任何好方法?

1 个答案:

答案 0 :(得分:0)

您似乎需要在帖子中解组为[]map[string]interface{}的数组结构。

据说你可以做这样的事情(使用当前的map[string]interface{}类型。

type Payload struct {
    Message map[string]interface{} `json:"message"`
}

// If you are using it as a http HandleFunc
func (s *Server) ProcessPayload() {
    PayloadHandler := func(w http.ResponseWriter, r *http.Request) {
        incoming := r.FormValue("message")
        if incoming != "" {
            var payload = new(Payload)
            json.Unmarshal([]byte(incoming), payload)

            go payload.FromPayload()
        }
    }

    http.HandleFunc("/payload", PayloadHandler)
}

func (p *Payload) FromPayload() {
    match, ok := p.Message["$match"]
    if !ok {
        return
    }
    // Do your work on the $match object
}