gpt4 book ai didi

MongoDB:查找匹配最多标签的文档

转载 作者:可可西里 更新时间:2023-11-01 09:12:22 25 4
gpt4 key购买 nike

在我的 meteor 应用程序中,我有大量文档,每个文档都有一个字段 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 的聚合框架。

所需的查询是什么样的?

最佳答案

I could also use mongoDB's aggregate framework if needed.

需要使用聚合管道,可以这样写:

  • Match 标签中至少有一个匹配值的文档数组。
  • 我们将展开并处理标签数组,因此保留一份每条记录中的标签数组。
  • 展开 tags 数组。
  • 匹配其标签值出现在输入数组中的记录。
  • _id字段分组,计算匹配的文档数。
  • 根据匹配次数对组进行排序
  • 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.
])

对/对:

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

关于MongoDB:查找匹配最多标签的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27326748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com