【问题标题】:Count the occurences of multiple items in an array计算数组中多个项目的出现次数
【发布时间】:2014-10-16 14:19:29
【问题描述】:

我有这样的文件

{
"text": "test description",
"tags": ["house", "garden", "wall"]
}

现在,如果我想在 MongoDB 中匹配乘法标签,我会这样做

db.test.find( { tags: { $in: [ "house", "garden", "fish" ] } } );

有没有一种方法可以获取每个文档的匹配标签数量(例如在文本搜索中使用 $meta:"textScore") 以便我可以按降序对文档与我的查询的匹配程度进行排序?

对于我上面的例子,我想知道有 2 个匹配的标签。

【问题讨论】:

    标签: json mongodb database


    【解决方案1】:

    我想你必须使用aggregation framework

    类似的东西

    db.test.aggregate( {$unwind:'$tags'},
                       {$match: {tags:{$in: ["house", "garden", "fish"]}}},
                       {$group: {_id:'$_id', tagcount:{$sum: 1}}} )
    

    解释:

    • $unwind 部分为 tags 数组中的每个元素创建一个文档
    • $match 从那些文档中选择那些与列表中的标签匹配的文档
    • $groupgreates 一个按 _id 分组的文档并计算每个匹配的文档

    结果应该是表单的文档列表

    {_id: id, tagcount: #matching tags}
    

    你也可以在末尾添加sort

    {$sort:{tagcount : -1}}
    

    所以对你的结构进行聚合查询以返回_id、文本、匹配标签和匹配标签的数量,按匹配标签的数量降序排列:

    db.test.aggregate( {$unwind:'$tags'},
                       {$match: {tags:{$in: ["house", "garden", "fish"]}}},
                       {$group: {_id: '$_id' , text : {$first:'$text'},
                                 tags:{$addToSet:'$tags'}, tagcount:{$sum: 1}}},
                       {$sort:{tagcount:-1}})
    

    示例文档的结果

    { "_id" : ObjectId("5..."), 
      "text" : "test description", 
      "tags" : [ "garden", "house" ],
      "tagcount" : 2 }
    

    【讨论】:

    • 感谢您的回答。在第一个示例中,$in 后缺少一个小的拼写冒号。
    猜你喜欢
    • 2011-12-27
    • 2014-03-18
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多