I am trying to convert this function here from mapreduce to aggregation.
The result from above function will be [{pending 1}]
.
When I run my match group I get [{pending 0}]
from the following code below:
mat := bson.M{
"$match": bson.M{"device_id": devId},
}
grp := bson.M{
"$group": bson.M{
"_id": "$status",
"count": bson.M{
"$sum": 1,
},
},
}
pipe := c.Pipe([]bson.M{mat,grp})
pipe.One(&result)
But the same I think command in mongo shell gives [{pending 1}]
.
db.getCollection("auth_sets").aggregate([
{
$match: {
device_id:"5c79601d152ece00012f5831"
}
},
{
$group: {
_id:"$status",
count: {
$sum: 1
}
}
},
]);
How can I get it so my pipe will return [{pending 1}]
?
I am changing it so I can use Mongo Atlas with does not allow mapreduce.
Your mgo
query structure is OK, the problem is the name of the count
field. The model expects Value
:
var result []struct {
Status string `bson:"_id"`
Value int
}
So change the $group
stage to this:
grp := bson.M{
"$group": bson.M{
"_id": "$status",
"value": bson.M{ // Note lowercased "value"!
"$sum": 1,
},
},
}
And it should work. Or change the model if you can:
var result []struct {
Status string `bson:"_id"`
Value int `bson:"count"`
}
Only one of them needs to be changed, to be aligned with the other.
One last thing: If you use Query.One()
, then the result
must not be a slice (One()
expects one document exactly).
Use a slice type for result
if you use e.g. Query.All()
.
So if you're going to use Query.One()
, use result:
var result struct {
Status string `bson:"_id"`
Value int `bson:"count"`
}
Also Query.One()
and Query.All()
return an error, do check it!