mgo.v2,$ sample总共返回1条记录

时间:2018-04-13 07:41:57

标签: go mgo

我需要从一个集合中获得1兰特记录。我在robo-mongo上检查它,效果很好。但是在使用mgo.v2的golang项目中,它始终会返回相同的记录。图书馆有没有错误,或者我误解了?

我使用“gopkg.in/mgo.v2”。这是我的代码:

var err error

    pipe := col.Pipe([]bson.M{
        {"$match": bson.M{ "ad_group_id": worker.creative.AdGroupId }},
        {"$sample": bson.M{ "size": 1 }},
    })
    var resp []model.Coordinate
    err = pipe.All(&resp)

log.Print("++++++++++++++++++++++++++++++++++++++++++++++++++: ",resp)

=>

[
    {
        ObjectIdHex("...") ObjectIdHex("...") ObjectIdHex("...") 
        {
            Point [33 33]
        } 
        t3
    }
]

协调馆藏 enter image description here

1 个答案:

答案 0 :(得分:0)

您对mgo包的使用无效。如果您使用Pipeline.One(),则应传递单个model.Coordinate*model.Coordinate的目标:

var resp model.Coordinate
err = pipe.One(&resp)

否则会出现如下错误:

Unsupported document type for unmarshalling: []model.Coordinate

如果您要获得单个结果,那么当然不需要在管道中指定size > 1,所以只需使用:

{"$sample": bson.M{"size": 1}},

如果您想获得多个随机结果,那么您可以在此示例中使用切片和Pipeline.All()

pipe := col.Pipe([]bson.M{
    {"$match": bson.M{"ad_group_id": worker.creative.AdGroupId}},
    {"$sample": bson.M{"size": 2}},
})
var resp []model.Coordinate
err = pipe.All(&resp)