当前位置: 首页 > 面试题库 >

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

戚宏扬
2023-03-14
问题内容

我试图实现$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)

我总是得到相同的错误: 字段(管道)的类型 错误 3 = 4

如果我理解正确,那是因为它不能正确地将结果解析回$
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?如果是这样,还有其他方法吗? 也许我可以将原始查询文本发送到mongo并接收原始响应并自己解析?


问题答案:

找到了解决方案!

技巧是在切片([]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



 类似资料:
  • 但在我看来不对。有人能建议别的方法做这件事吗。

  • 我有包含以下模式的文档的集合。我想过滤/查找所有包含性别女性的文档并汇总大脑评分的总和。我尝试了下面的语句,它显示了无效的管道错误。 架构:

  • 我使用Nodejs和MongoDB与expressjs和mongoose库,创建一个具有用户、文章和评论模式的博客API。下面是我使用的模式。

  • 主要内容:aggregate() 方法,管道MongoDB 中的聚合操作用来处理数据并返回计算结果,聚合操作可以将多个文档中的值组合在一起,并可对数据执行各种操作,以返回单个结果,有点类似于 SQL 语句中的 count(*)、group by 等。 aggregate() 方法 您可以使用 MongoDB 中的 aggregate() 方法来执行聚合操作,其语法格式如下: db.collection_name.aggregate(aggr

  • 我是聚合框架的新手,有以下问题。 我的收藏是这样的: 用户 ActivitiesFeed 活动 聚合函数 如何使用第一个查找结果进行查找? 我查阅了activities集合。此集合保存第二个查找BaseData.UserID的id。但是使用这种方法,第二次查找没有结果。 我对activities集合进行连接的原因是actionID可以保存来自另一个集合的用户id或文档id。它取决于activiti

  • 我使用Spring(引导)2.2.7与mongoDB 4.0运行在Debian Stretch(9.12)。我已经设置了3个集合,我试图通过聚合查找级联操作加入这些集合。 操作(节点类) 股票(组件类) 目录(产品类) 每个类都有一个将它们链接在一起的uuid字符串属性。 节点(传感器、接收器、基站等) 组件(带有序列号、条形码的交付产品…) 产品(市场人工制品) 在mongo shell中运行此