我需要从一个集合中获得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
}
]
答案 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)