- 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/
如果我使用过程编程语言,我会使用类似 sys.MAX_INT 的东西来代替 999999。SQL 中是否存在这样的东西?或者是否有更简洁的方法来摆脱此 SQL 中的 999999? SELECT
嗨,在 doctrine2 中有 ifnull 吗?我需要使用...如何使用? SELECT * FROM `apns_task_message` ORDER BY IFNULL( `sent_at`
我有以下数据集: { patientId: 228, medication: { atHome : [ { "drug" : "
我如何发表这个声明AND IFNULL ? TIMESTAMPDIFF(YEAR,a.date_of_birth,CURDATE()) >= '' AND TIMESTAMPDIFF(YEAR,a.d
当 MySQL SELECT 语句中没有结果时,我想要某个值(55) . 我试过了,但没用。 encode($arr); ?> 最佳答案 您收到错误,请尝试echo mysql_error();
我正在做报告,需要将逗号分隔字符串的列表传递到列。这很简单,我只需使用 mysql IN 运算符即可。唯一的问题是 post 变量有时可能为 NULL 那么我该如何组合: where column
我有一个包含整数值的表,我需要按列的总和进行查询: id, A, B, C 1, 21, 32, null 2, 9, 0, 124 3, null, null, 6
我在 table1 中有列,其中名称列有很多行为空 table1.name=table2.userID 所以我试图将 IFNULL 条件设置为这样 select (IFNULL(name,'empty
我有两个表,我为它们创建了左连接查询。假设它们是表A和表B。 当我触发查询时,如果表 B 包含表 A 中存在的键,则记录将根据它显示。如果键不匹配,则在所有列上显示 null 如果我必须替换 null
我将在我的选择查询中使用 IFNULL 检查 我想这样执行,当sum为null时打印0 这是我的整个查询 SELECT IFNULL(SELECT SUM(TOT_SALES_PRICE) F
可能是一个奇怪的组合,但我有一个查询,其中包括: SELECT IFNULL(`active`.`num`, `generic`.`num`) AS `num` ... `active` 和 `gen
我正在尝试使用以下方法获取剩余数量的书籍 stock = total+(receive-Issued); 表book_qnt - 图书数量列表 id | book | qnt ====
我有两个可以为 null 的 DATE 字段(PublishFrom、PublishTo)。我正在尝试通过此查询获取记录: SELECT * FROM tblNews WHERE Publis
我正在尝试更新一个表并将列 set_price 设置为另一个表中的值,如果它是 null。 两条记录共享相同的 prod_id。有人可以查看我的查询并告诉我它有什么问题吗? update list_
我正在处理一个查询,其中有一列帐号,我已使用 CONCAT 语句对其进行格式化,使数字 1-11111 而不是 11111。 有一列包含先前的帐号,但是除非确实存在先前的帐号,否则此值为 NULL。为
在下面的查询中,当它为 NULL 时,我想将“Percent”值设置为 0。但是,我似乎无法弄清楚如何将 IFNULL 函数正确地包装到我的查询中。任何帮助将不胜感激! SELECT number,
我正在开发一个 Yii2 框架应用程序,在我的数据建模阶段,我决定让数据库引擎处理简单的更新并维护我的计数器表(用于为用户返回未读消息的数量和其他内容)。 我在消息表上设计了一个触发器来增加和减少用户
您好,如果数据库中的数据为 NULL,我正在使用 mysqli 替换表中的默认值。我已经在 PHPmyAdmin 上试过了,它可以工作,但在我的代码上不行:( 这是我的 SELECT 查询: $que
id category active------------------------1 1 12 3 03 3
我正在尝试使用 IFNULL 来确定在 where 子句中使用列,但我认为我做的不正确。有人有什么建议吗? SELECT * FROM bdesclookuptable WHERE LOWER('Sa
我是一名优秀的程序员,十分优秀!