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

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() }
}

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

问题是error: reflect.Set: value of type bson.M is not assignable to type mypkg.MyInterface-有某种方法可以使这项工作吗?我试图使用原始结构的类型实例化tasks,但无法使其正常工作。

任何帮助将不胜感激-谢谢:)

最佳答案

由于MyInterface只是一个接口(interface),因此mgo无法创建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成为实现var tasks []MyStructType的类型(MyInterface)的对象的一部分,然后使其字段与数据库中bson对象的键和值类型匹配。如果您存储的数据是实现MyInterface的一种以上类型的数据,则可能不起作用,因此上面的maps maps选项。

另外,请谨慎使用Find(nil).All(&tasks)。如果该集合中有数百万条记录,则取决于记录大小,则可能内存不足。

关于mongodb - 使用界面通过mgo从数据库检索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15004200/

10-12 00:21