gpt4 book ai didi

go - 带有聚合和分组的 mgo

转载 作者:数据小太阳 更新时间:2023-10-29 03:04:06 26 4
gpt4 key购买 nike

我正在尝试使用 golang mgo 执行查询为了有效地从连接中获得不同的值,我知道这可能不是在 Mongo 中使用的最佳范例。

像这样:

pipe := []bson.M{

{
"$group": bson.M{
"_id": bson.M{"user": "$user"},

},
},

{
"$match": bson.M{
"_id": bson.M{"$exists": 1},
"user": bson.M{"$exists": 1},
"date_updated": bson.M{
"$gt": durationDays,
},
},

},

{
"$lookup": bson.M{
"from": "users",
"localField": "user",
"foreignField": "_id",
"as": "user_details",
},
},
{
"$lookup": bson.M{
"from": "organizations",
"localField": "organization",
"foreignField": "_id",
"as": "organization_details",
},
},

}

err := d.Pipe(pipe).All(&result)

如果我注释掉 $group 部分,查询将按预期返回连接。

如果我按原样运行,我得到 NULL

如果我将 $group 移动到管道的底部,我会得到一个包含 Null 值的数组响应

是否可以使用 $group 进行聚合(目的是模拟 DISTINCT)?

最佳答案

您获得 NULL 的原因是因为您的 $match 过滤器在 $group 阶段之后过滤掉所有文档。

$group 的第一阶段之后,文档仅如下例所示:

  {"_id": { "user": "foo"}},
{"_id": { "user": "bar"}},
{"_id": { "user": "baz"}}

它们不再包含其他字段,即 userdate_updatedorganization。如果你想保留他们的值(value),你可以利用 Group Accumulator Operator .根据您的用例,您还可能受益于使用 Aggregation Expression Variables

以使用 mongo shell 为例, 让我们使用 $first operator基本上选择第一次出现。这可能对 organization 有意义,但对 date_updated 没有意义。请选择更合适的累加器运算符。

{"$group": { 
"_id":"$user",
"date_updated": {"$first":"$date_updated"},
"organization": {"$first":"$organization"}
}
}

请注意,上面还用更简单的 {"_id":"$user"} 替换了 {"_id":{"user":"$user"}} >。

接下来我们将添加 $project stage将组操作中 _id 字段的结果重命名回 user。还可以不加修改地携带其他字段。

{"$project": {
"user": "$_id",
"date_updated": 1,
"organization": 1
}
}

你的 $match stage可以简化,只需列出 date_updated 过滤器。首先,我们可以删除 _id,因为它在管道中的这一点之前不再相关,而且如果您想确保只处理具有 user 值的文档,您应该将 $match 放在 $group 之前。参见 Aggregation Pipeline Optimization更多。

因此,所有这些组合起来将如下所示:

[
{"$group":{
"_id": "$user",
"date_updated": { "$first": "$date_updated"},
"organization": { $first: "$organization"}
}
},
{"$project":{
"user": "$_id",
"date_updated": 1,
"organization": 1
}
},
{"$match":{
"date_updated": {"$gt": durationDays } }
},
{"$lookup":{
"from": "users",
"localField": "user",
"foreignField": "_id",
"as": "user_details"
}
},
{"$lookup":{
"from": "organizations",
"localField": "organization",
"foreignField": "_id",
"as": "organization_details"
}
}
]

(我知道你知道)最后,根据上面的数据库模式,usersorganizations 集合,根据你的应用程序用例,你可能会重新-考虑嵌入一些值。你可能会发现 6 Rules of Thumb for MongoDB Schema Design有用。

关于go - 带有聚合和分组的 mgo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46244098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com