meteor - MongoDB: find documents that match the most tags -
in meteor app, have huge collection of documents, each field tags, this:
{..., tags: ["a","b","c"], ...}, {..., tags: ["a","b","d"], ...}, {..., tags: ["b","c","e"], ...}, {..., tags: ["x","y","z"], ...}, .... now want query collection on server tags, eg: ["a","d","y"] , results match @ least 1 tag, , resultset sorted number of matching tags. so, in exampleset result should be:
{..., tags: ["a","b","d"], ...}, {..., tags: ["a","b","c"], ...}, {..., tags: ["x","y","z"], ...} because first doc has 2 matches, "a" , "d", , other 2 elements have 1 match, "a" , "y".
currently know can use $in match documents have @ least 1 match, $all documents every tag matches, doesn't cut somehow. use mongodb's aggregate framework if needed.
what needed query like?
i use mongodb's aggregate framework if needed.
you need use the aggregation pipeline, can written below:
matchdocuments having @ least 1 matching value in tags array.- we unwinding , working on tags array, keep copy of tags array in each record.
unwindtagsarray.matchrecords have tags value present in input array.group_idfield , calculate number of documents have matched.sortgroups based on number of matches.projectrequired fields along original tags array copy had created.
code:
var inp = ["a","d","y"]; db.collection.aggregate([ {$match:{"tags":{$in:inp}}}, {$project:{"tagscopy":"$tags","tags":1}}, {$unwind:"$tags"}, {$match:{tags:{$in:inp}}}, {$group:{"_id":"$_id","noofmatches":{$sum:1},"tags":{$first:"$tagscopy"}}}, {$sort:{noofmatches:-1}}, {$project:{"_id":0,"noofmatches":1,tags:1}} //remove noofmatches , //add other required //fields necessary. ]) o/p:
{ "noofmatches" : 2, "tags" : [ "a", "b", "d" ] } { "noofmatches" : 1, "tags" : [ "x", "y", "z" ] } { "noofmatches" : 1, "tags" : [ "a", "b", "c" ] }
Comments
Post a Comment