- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个按以下方式定义的数据库结构。
{
name: "Jane",
films: [
{
title: "The Shawshank Redemption",
year: "1994"
},
{
title: "The Godfather",
year: "1972"
}
]
},
{
name: "Jack",
films: [
{
title: "12 Angry Men",
year: "1957"
},
{
title: "The Dark Knight",
year: "2008"
}
]
}
我想归还所有电影的一部分 - []Film
并且,如果可能的话,在另一个查询中,所有标题的一部分 - []string
从集合中。我可以拉出整个集合并提取应用程序逻辑中的相关数据,但是是否可以在查询中实现?我试过使用 Select()
方法,像这样:c.Find(nil).Select(<various conditions>).All(&results)
但我没有成功。
最佳答案
我认为这是关于 mongo
标签的最流行的问题之一。而且我必须说,如果你需要你做错了什么,也许你应该使用 RDBMS 而不是 Mongo,因为这种查询的性能下降将抵消 Mongo 的功能(如无模式、“一体式”文档等)的所有利润..
无论如何,答案很简单 - 您无法随心所欲地获取电影列表。 Mongo 的find
只能返回完整或部分顶级文档。我的意思是您可以使用 db.collection.find({}, {'films': 1})
查询获得的最佳结果是这样的列表
{
films: [
{
title: "The Shawshank Redemption",
year: 1994
},
{
title: "The Godfather",
year: 1972
}
]
},
{
films: [
{
title: "12 Angry Men",
year: 1957
},
{
title: "The Dark Knight",
year: 2008
}
]
}
不是你所期望的,对吧?
获取数组的唯一方法
{
title: "The Shawshank Redemption",
year: 1994
},
{
title: "The Godfather",
year: 1972
},
{
title: "12 Angry Men",
year: 1957
},
{
title: "The Dark Knight",
year: 2008
}
就是使用 aggregation 。
检索电影数组的基本 Mongo 查询是
db.collection.aggregate([{
$unwind: '$films'
}, {
$project: {
title: '$films.title',
year: '$films.year'
}
}])
此查询的 Go 代码是
package main
import (
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
"fmt"
)
func main() {
session, err := mgo.Dial("mongodb://127.0.0.1:27017/db")
if err != nil {
panic(err)
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
c := session.DB("db").C("collection")
pipe := c.Pipe(
[]bson.M{
bson.M{
"$unwind": "$films",
},
bson.M{
"$project": bson.M{
"title": "$films.title",
"year": "$films.year",
},
},
},
)
result := []bson.M{}
err = pipe.All(&result)
fmt.Printf("%+v", result) // [map[_id:ObjectIdHex("57a2ed6640ce01187e1c9164") title:The Shawshank Redemption year:1994] map[_id:ObjectIdHex("57a2ed6640ce01187e1c9164") title:The Godfather year:1972] map[_id:ObjectIdHex("57a2ed6f40ce01187e1c9165") title:12 Angry Men year:1957] map[year:2008 _id:ObjectIdHex("57a2ed6f40ce01187e1c9165") title:The Dark Knight]]
}
如果您需要其他条件来选择顶级文档,代码将是
pipe := c.Pipe(
[]bson.M{
bson.M{
"$match": bson.M{
"name": "Jane",
},
},
bson.M{
"$unwind": "$films",
},
bson.M{
"$project": bson.M{
"title": "$films.title",
"year": "$films.year",
},
},
},
)
// result [map[_id:ObjectIdHex("57a2ed6640ce01187e1c9164") title:The Shawshank Redemption year:1994] map[title:The Godfather year:1972 _id:ObjectIdHex("57a2ed6640ce01187e1c9164")]]
如果你需要过滤电影你可以使用下一个查询
pipe := c.Pipe(
[]bson.M{
bson.M{
"$unwind": "$films",
},
bson.M{
"$project": bson.M{
"title": "$films.title",
"year": "$films.year",
},
},
bson.M{
"$match": bson.M{
"year": bson.M{
"$gt": 2000,
},
},
},
},
)
// result [map[_id:ObjectIdHex("57a2ed6f40ce01187e1c9165") year:2008 title:The Dark Knight]]
聚合的问题是一个简单的事实,即大部分聚合操作不使用索引,并且在大型集合上可能会很慢。这就是为什么我建议您考虑 RDBMS,如果您需要大量聚合,它可能是更好的选择。
并且无法从 mgo
获取 []string
,因为它总是返回 bson.M
(或 [] bson.M
) 是 map[string]interface{}
。
关于mongodb - Go - mgo,从集合中检索所有嵌套字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38757819/
我最近开始学习 Go,到目前为止我非常喜欢它。我想了解如何使用 mgo Mongo 驱动程序制作 REST API。 在网站上,共有三个API:mgo、mgo/bson、mgo/txn。它们是什么意思
我有一个 GoLang 代码: c.Find(selectQuery).All(&results) if err == mgo.ErrNotFound { // error handling } se
我有一组动态的成分名称,并为每个用户提供。我想将它与 mongo 文档匹配,其中有一个名为 ingredients 的对象的 array 具有属性 name。我已经编写了一个查询(见下文),它将从 U
我 我很难将 MongoDB 查询转换为 mgo bson。 Mongo 记录模式如下所示。我想查找主题标签为“教育”和“学生”的记录。 db.questions.insert ( {
我正在尝试使用 mgo 库进行批量更新插入。我正在阅读 documentation关于批量更新插入,因为这是我第一次使用 MongoDB,看起来我必须提供成对的文档才能更新。 在我的函数中,我正在执行
我一直在为我的 API 使用 mgo,但我在我的 MongoDB 中看到许多当前连接(同时使用少于 5 个设备进行测试)。通过在我的 Mongo 服务器中执行 db.serverStatus().co
我正在尝试检索以下数据中每个 object_name 的最早创建日期和最后修改日期 { "_id" : ObjectId("5a510666b2e543371cff44ef"), "object_na
我是 Golang 的新手,我正在使用 mgo 框架构建 Golang CRUD 来练习。当我使用 mgo 插入一个元素时,插入了两次而不是一次,我在 MongoDB Compass 社区中检查了它。
我正在从事一个基于 MongoDB 数据结构的项目。我们存储在数据库中的对象如下所示: { "_id" : ObjectId("567a877df1c7720bea7c2f51"), "usernam
我正在尝试使用 golang mgo 执行查询为了有效地从连接中获得不同的值,我知道这可能不是在 Mongo 中使用的最佳范例。 像这样: pipe := []bson.M{ {
我的目标是实现这个 code .除了不使用 sql,我想使用 mongoDB。我认为我处理 session 的方式存在问题。 我正在尝试使用 mgo 通过 Rest API 将一些用户数据插入到 Mo
我正在尝试使用 Go 中的 mgo 库实现以下功能: db.artists.update( {_id: ObjectId("534944125117082b30000001")}, {
我的 Go 应用程序已使用 MGO 连接到 MongoDB(托管在 Compose.io 上),没有任何问题。 今天我决定删除这个数据库并添加一个不同的数据库(再次使用 Compose)。我更新了连接
我有这个模型数据,我用它来将数据保存到数据库中 type Nos struct { UnitCode string `json:"unitCode" bson:"unitCode
我正在用 mgo 编写一个数据库接口(interface)。我的模型中的某些文档引用了其他文档。 type Child struct{ Id bson.ObjectId `js
我有一个查询,它从包含特定文本的集合文档中返回所有名称。在以下示例中,不区分大小写地返回所有包含序列“oh”的名称;不返回文档中的其他字段: find({name:/oh/i}, {name:1, _
我使用以下 go 文件作为我的 http API 和 mgo 之间的层: package store import ( "reflect" "strings" "labix.o
我正在编写一个快速写入 mongodb 的应用程序。 mongodb 和 mgo 处理得太快了。我的问题是,有没有办法让我确定 mongo 跟不上并开始阻塞?但我也不想无谓地阻止。以下是模拟问题的代码
我有以下代码: competitionMatch := bson.M{ "$match": bson.M{"competition" : bson.M{"$in" : []string{"PREMIE
下面我设计了文档结构如下: type MIS_Course struct { ID bson.ObjectId `bson:"_id,omitempty"` Name string
我是一名优秀的程序员,十分优秀!