mongodb - Find all Mongo documents for which the max value in an array matches a query -


given document structure such this:

{    values: [       { value: 10 },       { value: 20 },       { value: 30 }    ] } 

i search documents maximum value in array matches query.

eg. if search documents maximum less 25 example above not match since 30 > 25.

how can this?

using .aggregate() method provides access aggregation pipeline.

if on version 3.2 or newer stage in pipeline $redact use $$keep , $$prune variables return or discard documents don't match criteria. in $cond expression use $max operator return maximum value in "values" array return the $map operator because $redact stage mentioned in documentation:

incorporates functionality of $project , $match

db.collection.aggregate([     { "$redact": {          "$cond": [             { "$lt": [                  { "$max": {                       "$map": {                           "input": "$values",                           "as": "value",                           "in": "$$value.value"                       }                 }},                  25             ]},              "$$keep",              "$$prune"          ]     }} ]) 

from version 3.0 backward need first denormalize "values" array using $unwind operator $group documents _id; compute maximum using $max , use $push accumulator operator return array of values. last stage $redact stage.

db.collection.aggregate([      { "$unwind": "$values" },      { "$group": {          "_id": "$_id",          "maxvalues": { "$max": "$values.value"},          "values": { "$push": "$values" }     }},      { "$redact": {          "$cond": [             { "$lt": [ "$maxvalues", 25 ] },             "$$keep",              "$$prune"          ]     }} ]) 

Comments

Popular posts from this blog

ruby - Trying to change last to "x"s to 23 -

jquery - Clone last and append item to closest class -

c - Unrecognised emulation mode: elf_i386 on MinGW32 -