mgo:查找类型为number(int,float64)的字段不起作用

时间:2016-07-28 09:49:24

标签: mongodb go mgo

我正在使用MongoDB的mgo驱动程序开发RESTful API。

问题在于我试图通过int类型的字段获取文档,并且没有返回结果。

例如我有这个文件:

{
  "_id" : ObjectId("5797833e9de6f8c5615a20f9"),
  "id" : "28743915-9be0-427d-980d-5009bfe1b13a",
  "name" : "Hunter",
  "rating" : 2.9,
  "downloads" : 5040
}

尝试使用以下内容获取此文档时

conn.Session.
    DB("face").
    C("papers").
    Find(bson.M{"rating": 2.9}).
    All(&papers) // papers is an instance of a slice struct.

它不会返回任何文档,但在mongo shell中执行相同操作会返回文档,例如:

db.papers.find({"rating": 2.9})

但是在mongo shell中执行此操作不会返回任何文档:

db.papers.find({"rating": "2.9"})

所以我认为问题可能是当bson.M被序列化时,它可能会将值转换为字符串,因为bson.M是 map [string] interface {} < / p>

这就是Paper结构的样子

type Paper struct {
    ID          string         `json:"id,omitempty" bson:"id"`
    Name        string         `json:"name,omitempty" bson:"name"`
    Rating      float64        `json:"rating" bson:"rating"`
    Downloads   int            `json:"downloads" bson:"downloads"`
}

1 个答案:

答案 0 :(得分:0)

我正在努力了解你的问题是什么,不能。最令人困惑的部分是你的问题解释

  
      
  1. 我正在尝试通过int

  2. 类型的字段获取文档   
  3. 查找(bson.M {“rating”:2.9})。

  4.   
  5. “评级”:2.9

  6.   

哪个世界2.9是整数?

  1. 没有类型number(你在标题中提到过),也没有Go,也没有Mongo。
  2. 如果您使用float64插入mgo,则会将其double
  3. 插入Mongo
  4. 您无法使用double查询来查询string。因此,db.papers.find({"rating": 2.9})会返回文档和db.papers.find({"rating": "2.9"}) - 不会,即使有少量文档包含"rating": 2.9
  5. mgomongo都没有错误。如果您有兴趣,可以使用以下Paper类插入地图和检索数据的示例代码:

    package main
    
    import (
        "gopkg.in/mgo.v2"
        "gopkg.in/mgo.v2/bson"
        "fmt"
    )
    
    type Paper struct {
        ID          string         `json:"id,omitempty" bson:"id"`
        Name        string         `json:"name,omitempty" bson:"name"`
        Rating      float64        `json:"rating" bson:"rating"`
        Downloads   int            `json:"downloads" bson:"downloads"`
    }
    
    func main() {
        session, err := mgo.Dial("mongodb://127.0.0.1:27017/face")
    
        if err != nil {
            panic(err)
        }
        defer session.Close()
        session.SetMode(mgo.Monotonic, true)
    
        c := session.DB("face").C("papers")
        c.Insert(bson.M{
            "id": "28743915-9be0-427d-980d-5009bfe1b13a",
            "name": "Hunter",
            "rating": 2.9,
            "downloads": 5040,
        })
    
        var papers []Paper
        c.Find(bson.M{"rating": 2.9}).All(&papers) // equivalent of db.papers.find({"rating": 2.9})
        fmt.Printf("%+v\n", papers)
    }