i want find documents scompetitions.length greater competitions.length.
here's sample documents document:
{ "_id" : objectid("59b28f432b4353d3f311dd1b"), "name" : "ford focus rs 2008", "requirements" : [ { "ranktype" : "d1", "competitions" : [ objectid("59b151fd2b4353d3f3116827"), objectid("59b151fd2b4353d3f3116829") ], "scompetitions" : [ "rallye monte-carlo", "rally sweden" ] }, { "ranktype" : "a3", "competitions" : [ objectid("59b151fd2b4353d3f3116f6b") ], "scompetitions" : [ "rally italia sardegna", "neste rally finland" ] } ] }, { "_id" : objectid("0000b28f432b4353f311dd1b"), "name" : "ford focus rs 2012", "requirements" : [ { "ranktype" : "d1", "competitions" : [ objectid("59b151fd2b4353d3f3116827"), objectid("59b151fd2b4353d3f3116829") ], "scompetitions" : [ "rallye monte-carlo", "rally sweden" ] }, { "ranktype" : "a3", "competitions" : [ objectid("59b151fd2b4353d3f3116f6b"), objectid("59b151fd2b4353d3f3116f6b") ], "scompetitions" : [ "rally italia sardegna", "neste rally finland" ] } ] } so looking @ samples return objectid("59b28f432b4353d3f311dd1b")
my problem requirements array itself, need somehow iterate it
no need "iterate". need $anyelementtrue check after returning results $map. , can inside $redact action:
model.aggregate([ { "$redact": { "$cond": { "if": { "$anyelementtrue": { "$map": { "input": "$requirements", "as": "r", "in": { "$gt": [ { "$size": "$$r.scompetitions" }, { "$size": "$$r.competitions" } ] } } } }, "then": "$$keep", "else": "$$prune" } }} ]) so it's simple comparison $size each array element, , if "any" of elements true, document "kept" or otherwise "pruned" results.
Comments
Post a Comment