【发布时间】:2019-05-26 02:45:23
【问题描述】:
我是 GoLang 和 MongoDB 的新手。我正在尝试使用 mgo 了解它们的关系。但是,我无法找到一个合适的示例来说明如何使用 mgo 从 Go 中的 mongo 中获取引用的对象。我听说过填充方法,但不知道 mgo 是如何使用它的。任何人都可以对此有所了解吗?
【问题讨论】:
我是 GoLang 和 MongoDB 的新手。我正在尝试使用 mgo 了解它们的关系。但是,我无法找到一个合适的示例来说明如何使用 mgo 从 Go 中的 mongo 中获取引用的对象。我听说过填充方法,但不知道 mgo 是如何使用它的。任何人都可以对此有所了解吗?
【问题讨论】:
MongoDB 提供$lookup 来执行左外连接。下面是一个使用 mgo 的例子。
func TestLookup(t *testing.T) {
var err error
uri := "mongodb://localhost/stackoverflow?replicaSet=replset"
dialInfo, _ := mgo.ParseURL(uri)
session, _ := mgo.DialWithInfo(dialInfo)
c := session.DB("stackoverflow").C("users")
pipeline := `
[{
"$lookup": {
"from": "addresses",
"localField": "address_id",
"foreignField": "_id",
"as": "address"
}
}, {
"$unwind": {
"path": "$address"
}
}, {
"$project": {
"_id": 0,
"name": "$name",
"address": "$address.address"
}
}]
`
var v []map[string]interface{}
var results []bson.M
json.Unmarshal([]byte(pipeline), &v)
if err = c.Pipe(v).All(&results); err != nil {
t.Fatal(err)
}
for _, doc := range results {
t.Log(doc)
}
}
【讨论】:
您的问题过于宽泛,但一般来说,如果您想通过单个查询获取“引用”对象,则必须使用 MongoDB 的 Aggregation framework,特别是 lookup 阶段。
聚合框架可以从mgo 与Collection.Pipe() 方法一起使用。
例如,请参阅Get a value in a reference of a lookup with MongoDB and Golang。
更多示例:
How to get the count value using $lookup in mongodb using golang?
【讨论】: