如何获得匹配给定单词的所有子串以及它们在mongodb中的计数?

时间:2017-08-30 10:34:25

标签: regex mongodb spring-boot mongodb-query aggregation-framework

我在使用spring boot从MongoDB检索数据时遇到以下问题。

这是我的架构:

class Item
{
    @Id
    String _id;
    String description;
}

假设数据库有以下内容:

{"Id1", "carrot vegetable"},
{"Id2", "vegies is a brand"},
{"Id3", "I am Vegetarian"},
{"Id4", "Potato vegetable"},
{"Id5", "Fruits"}

我想要实现的是获得以“veg”开头的术语及其数量。 这就是这样的事情:

{"vegetable", 2},
{"vegies", 1},
{"vegetarian", 1}

到目前为止,我遇到了 IndexOfCP 操作,可以从字符串中找到子字符串。

db.Item.aggregate([ { $match:{ description:/veg/gi } }, { $project:{ index:{ $indexOfCP:[ { $toLower:"$description" }, "veg" ] }, description:1 } }, { $sort:{ index:1 } } ])

但我在结果集中找不到匹配的术语及其计数。

我如何在mongo命令和spring boot中执行此操作。

1 个答案:

答案 0 :(得分:0)

db.Item.aggregate([ 
   { $match:{ description:/veg/gi } },
   { 
     $project :{
        matchedAndUniqWords:{
             $reduce:{
               input:{ $filter:{input:{$split:[{"$toLower":"$description"}," "]},as:"w",cond:{$ne:[{$indexOfCP:["$$w","veg"]},-1]}}},
               initialValue:[],
               in:{
                   $cond:[{$in:["$$this","$$value"]},{$concatArrays:[[],"$$value"]},{$concatArrays:[["$$this"],"$$value"]}]
                  }     
           }
        }
       }
     },
     {
      $unwind:{path : "$matchedAndUniqWords"}
   },
   {
     $group:{_id:"$matchedAndUniqWords",count:{"$sum":1}}
   }]);