草庐IT

node.js - Mongodb 基于具有计数的唯一子集合属性聚合搜索结果?

coder 2023-10-31 原文

几个小时以来,我一直在努力思考如何做到这一点,我有一个名为“Jobs”的集合——在内部,它们有一个子集合“Site”,即 Jobs.site。此站点子集合具有属性“UNID”。

我正在尝试基于文本搜索从数据库中检索文档,效果很好。

但我试图仅检索基于该 Job.Site.UNID 的 UNIQUE 文档,并且可能添加了一个计数作为额外属性。结果应如下所示:

工作:{ 站点:{ field1:'EXAMPLE',UNID:'SITEID',计数:5 }}

这意味着作业集合中有 5 个作业具有该 site.UNID。

这是我目前所拥有的:

[
// GETTING DOCS BASED ON TEXT SEARCH RESULTS
    {
      $match: {
        // clientId: req.user.client_id,
        $text: { $search: body.searchTerms }
      }
    },
// SORTING THEM BASED ON TEXTSCORE
    { $sort: { score: { $meta: 'textScore' } } },
// THE PROBLEMATIC GROUPING PART
    { $group: { site: { UPRN: '$UPRN', myCount: { $sum: 1 } } } },
// I ONYL WANT TO GET 20 DOCS AT A TIME
    { $limit: 20 },
// THE DATA THAT I WANT IN MY DOCUMENTS, MAYBE COUNT WOULD COME HERE?
    {
      $project: {
        site: true,
        score: { $meta: 'textScore' }
      }
    },
// GETTING RID OF POOR MATCHES BASED ON A SCORE CALCULATED IN ANOTHER 
// FUNCTION BASED ON THE NUMBER OF WORDS IN THE TEXT SEARCH
    {
      $match: {
        score: { $gt: matchScore }
      }
    }
  ]

这里让我印象深刻的是 The field 'site' must be an accumulator object

所以我想不出正确处理该子集合属性的语法。

编辑:感谢@Anthony,V2 完美地工作并且已经对其进行了彻底的测试,除了它似乎没有计算工作总数,它总是 1 或我在 $sum 中设置的任何值:但是有 200 多个结果,仍在工作在上面。

 { $match: { $text: { $search: body.searchTerms } } },
    { $sort: { $score: { $meta: 'textScore' } } },
    // { $match: { score: { $gt: 0.1 } } },
    {
      $group: {
        _id: '$UNID',
        counter: { $sum: 1 },
        score: { $first: { $meta: 'textScore' } },
        title: { $first: '$title' },
        postcode: { $first: '$postcode' },
        addressLine1: { $first: '$addressLine1' },
        city: { $first: '$city' },
        projectName: { $first: '$projectName' },
        jobsCount: { $sum: '$counter' }
      }
    },
    { $limit: 20 },
    {
      $project: {
        UNID: '$_id',
        title: '$title',
        postcode: '$postcode',
        addressLine1: '$addressLine1',
        projectName: '$projectName',
        city: '$city',
        score: 1,
        jobsCount: true
      }
    }

示例数据:


{
  "_id": "randomString0",
  "title": "Quality",
  "site": {
    "_id": "rKFRbvH8CEbJYdzDs",
    "title": "Title 1",
    "addressLine1": "address1",
    "UNID": "001",
    "city": "cityName",
    "createdAt": null
  }
},
{
  "_id": "randomString1",
  "title": "Some2123",
  "site": {
    "_id": "rKFRbvH8CEbJYdzDs",
    "title": "Title 1",
    "addressLine1": "address1",
    "UNID": "001",
    "city": "cityName",
    "createdAt": null
  }
},
{
  "_id": "randomString2",
  "title": "Random title",
  "site": {
    "_id": "rKFRbvH8CEbJYdzDs",
    "title": "Title 1",
    "addressLine1": "address1",
    "UNID": "001",
    "city": "cityName",
    "createdAt": null
  }
},
{
  "_id": "randomString3",
  "title": "Another unique job",
  "site": {
    "_id": "rKFRbvH8CEbJYdzDs",
    "title": "Title 1",
    "addressLine1": "address1",
    "UNID": "001",
    "city": "cityName",
    "createdAt": null
  }
},
{
  "_id": "randomString4",
  "title": "Other thing",
  "site": {
    "_id": "rKFRbvH8CEbJYdzDs",
    "title": "Title 1",
    "addressLine1": "address1",
    "UNID": "001",
    "city": "cityName",
    "createdAt": null
  }
},
{
  "_id": "randomString5",
  "title": "Something else",
  "site": {
    "_id": "rKFRbvH8CEbJYdzDs",
    "title": "Title 1",
    "addressLine1": "address1",
    "UNID": "001",
    "city": "cityName",
    "createdAt": null
  }
}

如您所见,站点数据在所有这 5 个文档下始终是唯一的,但是计数器应该计算有多少文档具有相同的唯一性

最佳答案

$group暂存 _id(您要分组的依据)表达式是必需的表达式。而且只有少数accumulators你可以使用 $group聚合阶段。

所以你的聚合一定是这样的

[
  { "$match": { "$text": { "$search": body.searchTerms }}},
  { "$sort": { "score": { "$meta": "textScore" } } },
  { "$match": { "score": { "$gt": matchScore }}},
  { "$group": {
    "_id": "$UPRN",
    "myCount": { "$sum": 1 },
    "score": { "$first": "$score" }
  }},
  { "$limit": 20 },
  { "$project": {
    "site": "$_id",
    "score": 1,
    "myCount": 1
  }}
]

关于node.js - Mongodb 基于具有计数的唯一子集合属性聚合搜索结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55636225/

有关node.js - Mongodb 基于具有计数的唯一子集合属性聚合搜索结果?的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  5. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  6. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  7. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  8. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  9. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

  10. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

随机推荐