【问题标题】:MongoDB: find documents that match the most tagsMongoDB:查找匹配最多标签的文档
【发布时间】:2015-02-04 06:20:23
【问题描述】:

在我的流星应用程序中,我有一个巨大的文档集合,每个都有一个字段tags,基本上是这样的:

{..., tags: ["a","b","c"], ...},
{..., tags: ["a","b","d"], ...},
{..., tags: ["b","c","e"], ...},
{..., tags: ["x","y","z"], ...},
....

现在我想用一些标签查询服务器上的集合,例如:["a","d","y"] 并获取所有匹配至少一个标签的结果,结果集按匹配标签的数量排序 .因此,在示例集中,结果应该是:

{..., tags: ["a","b","d"], ...},
{..., tags: ["a","b","c"], ...},
{..., tags: ["x","y","z"], ...}

因为第一个文档有两个匹配项"a""d",而另外两个元素有一个匹配项"a""y"

目前我知道我可以使用$in 来匹配至少有一个匹配项的所有文档,$all 来获取每个标签匹配的所有文档,但这并不能以某种方式削减它。如果需要,我还可以使用 mongoDB 的聚合框架。

所需的查询是什么样的?

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

    如果需要,我也可以使用 mongoDB 的聚合框架。

    你需要使用聚合管道,可以写成如下:

    • Match 标签中至少有一个匹配值的文档 数组。
    • 我们将展开并处理标签数组,因此请保留一份 每条记录中的标签数组。
    • Unwind tags 数组。
    • Match 输入数组中存在标签值的记录。
    • Group 通过_id 字段计算匹配的文档数。
    • Sort 基于匹配数的组。
    • project 必填字段以及我们创建的原始标签数组副本。

    代码:

    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 and 
                                                //add other required 
                                                //fields which are necessary.
    ])
    

    o/p:

    { "noOfMatches" : 2, "tags" : [ "a", "b", "d" ] }
    { "noOfMatches" : 1, "tags" : [ "x", "y", "z" ] }
    { "noOfMatches" : 1, "tags" : [ "a", "b", "c" ] }
    

    【讨论】:

    • 最受欢迎。;-) 作为一个附带问题,当流星对聚合的支持非常有限时,为什么你选择流星而不是 nodejs?
    • atmospherejs.com/meteorhacks/aggregate except 这个查询的概念。许多客户端繁重的计算分布在活跃用户和(软)实时功能上。 (有点像新闻聚合器)。
    • 跟进:通过在整个管道中完全跳过 $tagsCopy(因此只使用标签、_id 和 sum)将处理时间从 1300 毫秒减少到
    • 我收藏了{"_id": "test-id", {"val" {"tags": ["a", "b", "c"]}}}。我该如何查询?
    猜你喜欢
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2018-08-20
    • 2020-11-17
    相关资源
    最近更新 更多