草庐IT

具有排名/搜索计数的 Mongodb

coder 2023-11-04 原文

大家好!

我试图寻找解决方案 3 天,但找不到任何解决方案。希望你们能帮助我。

数据

{       
 'item': 'pen-1', 
 'colors': [ 'yellow', 'green', 'blue', 'red', 'pink', 'purple' ] //total: 6
  },
  {
 'item': 'pen-2', 
 'colors': [ 'green', 'blue','pink', 'purple' ] //total: 4
 }

这是我到目前为止所做的查询:

var col = ['yellow', 'red', 'blue'];
db.getCollection('data').aggregate([
            { $match: { colors : { $in : col } } },
            { $group: { _id: { 'item': '$item',  colors: { $size : '$colors' } } } }
          ])

结果

{
    "_id" : {
        "item" : "pen-1",
        "colors" : 6
    }
}
{
    "_id" : {
        "item" : "pen-2",
        "colors" : 4
    }
}

我想做什么:

返回, 返回总计(颜色/匹配的颜色) 所以它会是这样的:

"_id" : {
        "item" : "pen-1",
        "rank": 0.5 // total colors(6) / that match(3)
    }

 "_id" : {
        "item" : "pen-2",
        "rank": 0.25 // total colors(4) / that match(1)
    }

最佳答案

您可以使用 $setIntersection 运算符,它接受两个或多个数组并返回一个包含出现在每个输入数组中的元素的数组。然后您可以使用 $size 返回结果数组中元素的数量以获得匹配的总颜色。

如果使用 MongoDB 3.4 和更新版本,则 $addFields 将允许您向文档添加一个额外的字段而无需显式投影其余字段,否则 $project 就足够了。

下面的例子展示了这一点:

var col = ['yellow', 'red', 'blue'];
db.getCollection('data').aggregate([
    { "$match": { "colors": { "$in": col } } },
    {
        "$addFields": {
            "rank": {
                "$divide": [                        
                    { "$size": { "$setIntersection": ["$colors", col] } },
                    { "$size": "$colors" }
                ]
            }
        }
    },
    { "$sort": { "rank": 1 } }            
])

示例输出

/* 1 */
{
    "_id" : ObjectId("58c645eaf3d1c82da16279a6"),
    "item" : "pen-2",
    "colors" : [ 
        "green", 
        "blue", 
        "pink", 
        "purple"
    ],
    "rank" : 0.25
}

/* 2 */
{
    "_id" : ObjectId("58c645eaf3d1c82da16279a5"),
    "item" : "pen-1",
    "colors" : [ 
        "yellow", 
        "green", 
        "blue", 
        "red", 
        "pink", 
        "purple"
    ],
    "rank" : 0.5
}

关于具有排名/搜索计数的 Mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42757391/

有关具有排名/搜索计数的 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 - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  3. 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

  4. 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']

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

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

  6. ruby - 具有两个参数的 block - 2

    我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋

  7. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  8. ruby - 如何搜索有用的 ruby - 2

    寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是ruby​​gems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和ruby​​gems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko

  9. ruby - 如何搜索、递增和替换 Ruby 字符串中的整数子字符串? - 2

    我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/

  10. ruby-on-rails - 具有同名的模块和类 - 2

    我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use

随机推荐