json - 计算数组中多个项目的出现次数

标签 json mongodb database

我有这样一个文档

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

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

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

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

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

最佳答案

您将不得不使用 aggregation framework我认为。

像这样

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

解释:

  • $unwind部分为标签数组中的每个元素制作一个文档
  • $match从那些文档中选择与列表中的标签匹配的文档
  • $group对按 _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 }

关于json - 计算数组中多个项目的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25451914/

相关文章:

database - Laravel DB facade 如何表达 LIKE

database - Google BigQuery - “未找到 : Project [project-id]

javascript - 使用javascript中的数据链接下载大文件时出错

javascript - 如何从通配符属性名称获取排序顺序

javascript - Javascript foreach 异步行为问题

mongodb - 如何使用 Homebrew 软件安装早期版本的 mongodb?

json - HAProxy 1.5 - 在 504 错误上提供静态 json 文件

json - Serilog.Sinks.Postgresql : Read configuration from appsettings. json

mongodb - Angular 5 + Material 设计 : <mat-select> how to set the default value?

database - Cassandra CLUSTERING ORDER BY 不做我期望的