- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在努力将查询从 mongo 控制台移植到我的 Go 代码。我是 MongoDB 的新手,所以可能还有其他我没有考虑到的错误。
示例数据“用户”集合:
{ "_id" : ObjectId("592400188d84961b7f34b0cd"), "username" : "randomUser2", "location" : { "type" : "Point", "coordinates" : [ -17.282573, 63.755657 ] } }
{ "_id" : ObjectId("592400188d84961b7f34b0ce"), "username" : "randomUser1", "location" : { "type" : "Point", "coordinates" : [ -17.634135, 65.705665 ] } }
示例数据“newscounter”集合:
{ "_id" : ObjectId("592400188d84961b7f34b0cd"), "count" : 14 }
mongo 中的查询如下所示:
db.users.aggregate([
{ $geoNear: {
near: { type: "Point", coordinates: [-21.861198,64.120877] },
distanceField: "distance",
maxDistance: myDistance * 1000,
spherical: true }
},
{
$sort: { "distance": 1 }
},
{
$lookup: {
from: "newscounter",
localField: "_id",
foreignField: "_id",
as: "news_count" }
},
{
$unwind: { path: "$news_count", preserveNullAndEmptyArrays: true }
},
{
$project : {
"id": 1,
"username": 1,
"distance": 1,
"news_count": { $ifNull : ["$news_count.count", 0] }
}
}
])
输出是(我在这里为计算的距离场使用了随机值):
{ "_id" : ObjectId("592400188d84961b7f34b0cd"), "username" : "randomUser2", "distance" : 123, "news_count" : 14 }
{ "_id" : ObjectId("592400188d84961b7f34b0ce"), "username" : "randomUser1", "distance" : 456, "news_count" : 0 }
我遇到麻烦的部分是 $project 阶段的 $ifNull。
如何使用 mgo 包在 Go 中构建 $ifNull 行?
我试过:
"news_count": bson.M{
"$ifNull": [2]interface{}{"$news_count.count", 0},
}
但它总是为 news_count 字段返回一个空字符串。
非常感谢任何帮助!
编辑[已解决]:
这个问题很愚蠢,我在 Go struct
中为 news_count
字段输入了错误的 type
。
为了完整起见,Go 中的管道是:
p := []bson.M{
bson.M{
"$geoNear": bson.M{
"near": bson.M{"type": "Point", "coordinates": center},
"distanceField": "distance",
"maxDistance": maxDistance,
"spherical": true,
},
},
bson.M{
"$sort": bson.M{
"distance": 1,
},
},
bson.M{
"$lookup": bson.M{
"from": "newscount",
"localField": "_id",
"foreignField": "_id",
"as": "news_count",
},
},
bson.M{
"$unwind": bson.M{
"path": "$news_count",
"preserveNullAndEmptyArrays": true,
},
},
bson.M{
"$project": bson.M{
"_id": 1,
"username": 1,
"distance": 1,
"news_count": bson.M{
"$ifNull": []interface{}{"$news_count.count", 0.0},
},
},
},
}
结果结构
:
type Result struct {
ID bson.ObjectId `json:"id" bson:"_id"`
Username string `json:"username" bson:"username"`
Distance int64 `json:"distance" bson:"distance"`
NewsCount int64 `json:"news_count" bson:"news_count"`
}
最佳答案
您的 news_count
投影有效,错误出在您尚未发布的代码中的其他地方。
查看这个完整的工作示例:
cu := sess.DB("").C("users")
cnc := sess.DB("").C("newscounter")
he := func(err error) {
if err != nil {
panic(err)
}
}
he(cu.Insert(
bson.M{
"_id": bson.ObjectIdHex("592400188d84961b7f34b0ce"),
"username": "randomuser1",
"location": bson.M{
"type": "Point",
"coordinates": []interface{}{-17.634135, 65.705665},
},
},
bson.M{
"_id": bson.ObjectIdHex("592400188d84961b7f34b0cd"),
"username": "randomuser2",
"location": bson.M{
"type": "Point",
"coordinates": []interface{}{-17.282573, 63.755657},
},
},
))
he(cnc.Insert(
bson.M{
"_id": bson.ObjectIdHex("592400188d84961b7f34b0cd"),
"count": 14,
},
))
pipe := cu.Pipe([]bson.M{
{
"$geoNear": bson.M{
"near": bson.M{
"type": "Point",
"coordinates": []interface{}{-21.861198, 64.120877},
},
"distanceField": "distance",
"maxDistance": 123456789,
"spherical": true,
},
},
{
"$sort": bson.M{"distance": 1},
},
{
"$lookup": bson.M{
"from": "newscounter",
"localField": "_id",
"foreignField": "_id",
"as": "news_count",
},
},
{
"$unwind": bson.M{
"path": "$news_count",
"preserveNullAndEmptyArrays": true,
},
},
{
"$project": bson.M{
"id": 1,
"username": 1,
"distance": 1,
"news_count": bson.M{
"$ifNull": []interface{}{"$news_count.count", 0},
},
},
},
})
it := pipe.Iter()
fmt.Println()
m := bson.M{}
for it.Next(&m) {
fmt.Println(m)
fmt.Println()
}
he(it.Err())
输出:
map[_id:ObjectIdHex("592400188d84961b7f34b0cd") username:randomuser2 distance:227534.08191011765 news_count:14]
map[username:randomuser1 distance:266222.98643136176 news_count:0 _id:ObjectIdHex("592400188d84961b7f34b0ce")]
关于MongoDB $ifNull 条件与 mgo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44155465/
我最近开始学习 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
我是一名优秀的程序员,十分优秀!