如何在带有库 mgo 的 golang 中使用 $facet?
how to use $facet in golang with library mgo?
我在 mongoDb 上开始学习性能改进。我有一个基于问题的聚合函数。
我创建了一个包含 3 个字段产品、颜色和年份的基本测试集合:
{
"product" : "car",
"colour" : "red",
"year" : "2019"
}
{
"product" : "car",
"colour" : "black",
"year" : "2018"
}
{
"product" : "bike",
"colour" : "blue",
"year" : "2014"
}
{
"product" : "train",
"colour" : "black",
"year" : "2019"
}
{
"product" : "ship",
"colour" : "red",
"year" : "2018"
}
{
"product" : "car",
"colour" : "red",
"year" : "2016"
}
{
"product" : "car",
"colour" : "blue",
"year" : "2015"
}
{
"product" : "bike",
"colour" : "white",
"year" : "2014"
}
{
"product" : "train",
"colour" : "red",
"year" : "2016"
}
{
"product" : "ship",
"colour" : "red",
"year" : "2015"
}
由于性能问题,我希望将 facet 用于单个聚合阶段:
db.getCollection('test').aggregate([
{
"$match":{
"colour":"red"
}
},
{
"$facet": {
"cntOfReds":[
{"$group":{"_id": "$product", "count": {"$sum": 1}}}
],
"cntOfRedsIn2015":[
{"$match" :{"year": "2015"}},
{"$group": {"_id": "$year", "count": {"$sum": 1}}}
]
} }
])
我们如何使用 mgo.v2 在 golang 上实现相同的查询并将结果设置为结构?
使用 mgo,您必须将文档数组传递给 Pipe
:
p:=collection.Pipe([]bson.M{
{"$match": bson.M{"colour":"red"}},
{"$facet": bson.M{ "cntOfReds":[]bson.M{{"$group":{"_id": "$product", "count": bson.M{"$sum":1}}}}},
"cntOfRedsIn2015": ...
然后,运行管道并得到结果:
p.All(&results)
我在 mongoDb 上开始学习性能改进。我有一个基于问题的聚合函数。 我创建了一个包含 3 个字段产品、颜色和年份的基本测试集合:
{
"product" : "car",
"colour" : "red",
"year" : "2019"
}
{
"product" : "car",
"colour" : "black",
"year" : "2018"
}
{
"product" : "bike",
"colour" : "blue",
"year" : "2014"
}
{
"product" : "train",
"colour" : "black",
"year" : "2019"
}
{
"product" : "ship",
"colour" : "red",
"year" : "2018"
}
{
"product" : "car",
"colour" : "red",
"year" : "2016"
}
{
"product" : "car",
"colour" : "blue",
"year" : "2015"
}
{
"product" : "bike",
"colour" : "white",
"year" : "2014"
}
{
"product" : "train",
"colour" : "red",
"year" : "2016"
}
{
"product" : "ship",
"colour" : "red",
"year" : "2015"
}
由于性能问题,我希望将 facet 用于单个聚合阶段:
db.getCollection('test').aggregate([
{
"$match":{
"colour":"red"
}
},
{
"$facet": {
"cntOfReds":[
{"$group":{"_id": "$product", "count": {"$sum": 1}}}
],
"cntOfRedsIn2015":[
{"$match" :{"year": "2015"}},
{"$group": {"_id": "$year", "count": {"$sum": 1}}}
]
} }
])
我们如何使用 mgo.v2 在 golang 上实现相同的查询并将结果设置为结构?
使用 mgo,您必须将文档数组传递给 Pipe
:
p:=collection.Pipe([]bson.M{
{"$match": bson.M{"colour":"red"}},
{"$facet": bson.M{ "cntOfReds":[]bson.M{{"$group":{"_id": "$product", "count": bson.M{"$sum":1}}}}},
"cntOfRedsIn2015": ...
然后,运行管道并得到结果:
p.All(&results)