Accomulator calculate values from field values found in multiple documents.
// prepare data
> db.acc.insertOne({"name":"a","nums":[{"num":1},{"num":2},{"num":3}]})
{
"acknowledged" : true,
"insertedId" : ObjectId("5f8502a6651639530e9c2b8b")
}
> db.acc.insertOne({"name":"b","nums":[{"num":2},{"num":3},{"num":4}]})
{
"acknowledged" : true,
"insertedId" : ObjectId("5f8502b5651639530e9c2b8c")
}
> db.acc.insertOne({"name":"c","nums":[{"num":3},{"num":4},{"num":5}]})
{
"acknowledged" : true,
"insertedId" : ObjectId("5f8502c2651639530e9c2b8d")
}
> db.acc.insertOne({"name":"d","nums":[]})
{
"acknowledged" : true,
"insertedId" : ObjectId("5f8502d3651639530e9c2b8e")
}
> db.acc.insertOne({"name":"e"})
{
"acknowledged" : true,
"insertedId" : ObjectId("5f8502f3651639530e9c2b8f")
}
// data seems like
> db.acc.find().pretty()
{
"_id" : ObjectId("5f8502a6651639530e9c2b8b"),
"name" : "a",
"nums" : [
{
"num" : 1
},
{
"num" : 2
},
{
"num" : 3
}
]
}
{
"_id" : ObjectId("5f8502b5651639530e9c2b8c"),
"name" : "b",
"nums" : [
{
"num" : 2
},
{
"num" : 3
},
{
"num" : 4
}
]
}
{
"_id" : ObjectId("5f8502c2651639530e9c2b8d"),
"name" : "c",
"nums" : [
{
"num" : 3
},
{
"num" : 4
},
{
"num" : 5
}
]
}
{ "_id" : ObjectId("5f8502d3651639530e9c2b8e"), "name" : "d", "nums" : [ ] }
{ "_id" : ObjectId("5f8502f3651639530e9c2b8f"), "name" : "e" }
$exists filter out empty nums
> db.acc.aggregate({$match:{"nums":{$exists:true,$ne:[]}}})
{ "_id" : ObjectId("5f8502a6651639530e9c2b8b"), "name" : "a", "nums" : [ { "num" : 1 }, { "num" : 2 }, { "num" : 3 } ] }
{ "_id" : ObjectId("5f8502b5651639530e9c2b8c"), "name" : "b", "nums" : [ { "num" : 2 }, { "num" : 3 }, { "num" : 4 } ] }
{ "_id" : ObjectId("5f8502c2651639530e9c2b8d"), "name" : "c", "nums" : [ { "num" : 3 }, { "num" : 4 }, { "num" : 5 } ] }
$max to get max element
> db.acc.aggregate({$match:{"nums":{$exists:true,$ne:[]}}},{$project:{max:{$max:"$nums.num"}}})
{ "_id" : ObjectId("5f8502a6651639530e9c2b8b"), "max" : 3 }
{ "_id" : ObjectId("5f8502b5651639530e9c2b8c"), "max" : 4 }
{ "_id" : ObjectId("5f8502c2651639530e9c2b8d"), "max" : 5 }
$sum to get total number
> db.acc.aggregate({$match:{"nums":{$exists:true,$ne:[]}}},{$project:{max:{$sum:"$nums.num"}}})
{ "_id" : ObjectId("5f8502a6651639530e9c2b8b"), "max" : 6 }
{ "_id" : ObjectId("5f8502b5651639530e9c2b8c"), "max" : 9 }
{ "_id" : ObjectId("5f8502c2651639530e9c2b8d"), "max" : 12 }
沒有留言:
張貼留言