使用接口通过mgo从数据库中检索



我有以下(未测试)功能:

func Execute(task MyInterface) {
    db := session.DB(task.Database()).C(task.Collection())
    var tasks []MyInterface
    db.Find(nil).All(&tasks)
    for _, t := range tasks { t.Do() }
}

我想给我的函数一个实现接口MyInterface的结构。然后,它应该从mongodb中检索一些值,并对检索到的结构调用一个方法。

问题是error: reflect.Set: value of type bson.M is not assignable to type mypkg.MyInterface——有什么办法让它发挥作用吗?我尝试使用原始结构的类型实例化tasks,但无法使其工作。

如有任何帮助,我们将不胜感激-谢谢:)

mgo无法创建MyInterface对象,因为MyInterface只是一个接口。尝试做:

myObject := &MyInterface{}  //fails

我认为这基本上就是mgo对它试图解组的每一条记录所做的。

要实现您想要的,请将tasks设置为[]map[string]interface{}[]bson.M类型(后者是前者的别名),然后:

for _, o := range tasks {
    t := &MyTypeThatImplementsMyInterface{ 
        Field1 : o["my_field"],
        //etc.  
    } 
    t.Do()
}

或者使tasks成为实现MyInterface的类型(var tasks []MyStructType)的对象的切片,并且其字段与数据库中bson对象的键和值类型匹配。如果您存储的数据是实现MyInterface的多个类型,那么这可能不起作用,因此是上面的slice of maps选项。

此外,对Find(nil).All(&tasks)也要谨慎。如果该集合中有数百万条记录,根据记录的大小,您可能会内存不足。

最新更新