几个小时以来,我一直在努力思考如何做到这一点,我有一个名为“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/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我希望我的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
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个具有一些属性的模型: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
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
尝试在我的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
我正在尝试按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']
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#