Hello!
I figured it out, its ugly… it works! Thanks a lot for the help!
testdata:
{
"_id" : ObjectId("5f7c5d430d4d5883c0c4b278"),
"name" : "A",
"values" : ["x","c","b","o","m"]
}
{
"_id" : ObjectId("5f7c5d630d4d5883c0c4b279"),
"name" : "B",
"values" : ["f","c","m"]
}
{
"_id" : ObjectId("5f7c5d630d4d5883c0c4b27a"),
"name" : "C",
"values" : ["x","c","b","5"]
}
The code im running on it:
var filter = ["a","b","c","e","f","k","j","l","p","s","m","x","y"]
db.test.aggregate([
{$project:{id: "$_id",
name:"$name",
values: "$values",
originSize: {$size:"$values"},
common:{$setIntersection:[ filter,"$values"]}}},
{$project:{id: "$_id",
name:"$name",
values: "$values",
common:"$common",
originSize: {$size:"$values"},
commonSize:{$size:{$setIntersection:[ filter,"$values"]}}}},
{$project:{
id:"$_id",
name: "$name",
values:"$values",
originSize: "$originSize",
common:"$common",
commonSize: "$commonSize",
difference:{ $subtract:["$originSize","$commonSize"]}}},
{$project:{
name: "$name",
values:"$values",
originSize: "$originSize",
common:"$common",
commonSize: "$commonSize",
difference:"$difference",
missing:{$setDifference:["$values","$common"]}}},
{$sort:{difference:1,originSize:-1}},
])
just one of the outputs:
{ "_id" : ObjectId("5f7c5d630d4d5883c0c4b27a"),
"name" : "C",
"values" : ["x","c","b","5"],
"originSize" : NumberInt(4),
"common" : ["b","c","x"],
"commonSize" : NumberInt(3),
"difference" : NumberInt(1),
"missing" : ["5"]
}
My question is: how can i store data generated inside the aggregate (var d= difference or something like this), so i don’t have to $project them every time, to use it later?
Is it possible to declare functions from these $project sequences end nesting them into each other?
Can i transfer data (result) from one to the next aggregate sequence?