Go中的MongoDB聚合查找(mgo.v2)

我试图实现$lookup使用中去(golang)我的MongoDB查询的一个功能氧化镁包。

以下是我的:

"_id"    : ObjectId("22222222222222"),

"name" : "Media",

"level" : 1,

"userIDs": [ObjectId("4444444444444")]

"_id"      : ObjectId("11111111111111"),

"title" : "Media Management",

"body" : BinData(0,"PvQ6z2NBm4265duo/e2XsYxA5bXKo="),

"level" : 1,

"folderID" : ObjectId("22222222222222"), // Foreign Key/Field

"userIDs" : [ObjectId("44444444444444")]

以下是我编写的在外壳程序上成功运行的查询:

var query = [

{

"$lookup": {

"from": "documents",

"localField": "_id",

"foreignField": "folderID",

"as": "documents",

}

}

,{

"$match": {

"userIDs": ObjectId("userIdHere"), // filder by a userID

"level": {$gte: 0}, // filter by a folder level

},

}

];

db.folders.aggregate(query).pretty().shellPrint();

如果我在外壳上运行此脚本,则会得到所需的结果。基本上,folder集合会返回给我,其中包含documents通过链接的全部相关内容$lookup。我不在这里包括它,因为这个问题似乎已经太久了。

我试图将此查询转换为 mgo 能够解析和执行的内容。在下面的go代码中:

query := bson.M{

"$lookup": bson.M{ // lookup the documents table here

"from": "documents",

"localField": "_id",

"foreignField": "folderID",

"as": "documents",

},

"$match": bson.M{

"level": bson.M{"$gte": user.Level}, // filter by level

"userIDs": user.ID, // filter by user

},

}

pipe := collection.Pipe(query) // querying the "folders" collection

err := pipe.All(&result)

我总是得到相同的错误: 错误

如果我理解正确,那是因为它不能正确地将结果解析回$

result对象。我已尽力确保该结构具有所需的确切结构。我还尝试传递一个泛型[]interface{}和空bson.M{}对象。仍然收到相同的错误。

以下是我的文件夹结构:

type Folder struct {

ID bson.ObjectId `json:"id" bson:"_id"`

Name string `json:"name"`

Level int `json:"level"`

UserIDs []bson.ObjectId `json:"userIDs" bson:"userIDs"`

Users []User `json:"-" bson:"-"` // doesn't get stored in the database

Documents []Document `json:"-" bson:"-"` // doesn't get stored in the database

}

我还删除了该$match子句,以查看是否可以从该$lookup查询中获得任何回报。但是我仍然遇到同样的错误。

也许mgo软件包不支持$lookup?如果是这样,还有其他方法吗?

回答:

找到了解决方案!

技巧是在切片([]bson.M)中创建查询并稍微更改查询的结构:

query := []bson.M{{

"$lookup": bson.M{ // lookup the documents table here

"from": "documents",

"localField": "_id",

"foreignField": "folderID",

"as": "documents",

}},

{"$match": bson.M{

"level": bson.M{"$lte": user.Level},

"userIDs": user.ID,

}}}

pipe := collection.Pipe(query)

err := pipe.All(&folders)

我在mgo的Pipe函数文档中找到了线索。另外,我必须Documents在我的Folders结构中更改该字段的标签,以便mgo对该字段进行标注:

type Folder struct {

ID bson.ObjectId `json:"id" bson:"_id"`

Name string `json:"name"`

Level int `json:"level"`

UserIDs []bson.ObjectId `json:"userIDs" bson:"userIDs"`

Users []User `json:"-" bson:"-"` // doesn't get stored in the database

Documents []Document // `json:"-" bson:"-" Removed this so that mgo can unmarshal

// the documents correctly

}

现在,我只需要想出一种方法,即可Documents在保存时不将字段存储在数据库中Folder

以上是 Go中的MongoDB聚合查找(mgo.v2) 的全部内容, 来源链接: utcz.com/qa/402118.html

回到顶部