草庐IT

mongodb - 分组并计算存储在两个单独字段中的 ObjectID 的出现次数

coder 2023-11-01 原文

我是 MongoDB 的新手,我不确定如何有效地解决这个问题。 在我的应用程序中,用户可以在一个对象或另一个对象之间进行选择(多次,通过给出正面/负面评级)。我想做的是计算一个对象被评为正面和负面的次数。 为了给你一个更准确的想法,这里有一些数据样本(我删除了一些字段以使其更简单)(我需要这种形式的数据,因为不允许用户对同一对对象进行两次评级):

{
    "_id" : ObjectId("579688a5336f04d208747fe8"),
    "positive" : ObjectId("5796708d58cc25ab040a6cda"),
    "negative" : ObjectId("5796705c58cc25ab040a6cd7")
},
{
    "_id" : ObjectId("579688a7336f04d208747fe9"),
    "positive" : ObjectId("5796706358cc25ab040a6cd8"),
    "negative" : ObjectId("5796708058cc25ab040a6cd9")
},
{
    "_id" : ObjectId("579688a8336f04d208747fea"),
    "positive" : ObjectId("5796708d58cc25ab040a6cda"),
    "negative" : ObjectId("5796706358cc25ab040a6cd8")
},
{
    "_id" : ObjectId("579688a8336f04d208747feb"),
    "positive" : ObjectId("5796708d58cc25ab040a6cda"),
    "negative" : ObjectId("5796706358cc25ab040a6cd8")
}...

我需要运行一个以这种方式返回数据的命令:

{
  "_id": ObjectId("5796708d58cc25ab040a6cda"),
  "positiveCount": 3,
  "negativeCount": 0
},
{
  "_id": ObjectId("5796705c58cc25ab040a6cd7"),
  "positiveCount": 0,
  "negativeCount": 1
}, ...

到目前为止,我只能使用以下命令分别计算正面或负面评级的数量:

db.getCollection('votes').aggregate([
{$group:{_id:'$positive', count: {$sum:1}}}
]);

这有效,但仅用于计算赞成票或反对票。这是我得到的结果

{
    "_id" : ObjectId("57971bb60711a9a6046dccc7"),
    "count" : 7.0
},
{
    "_id" : ObjectId("5796708058cc25ab040a6cd9"),
    "count" : 21.0
}...

到目前为止,我的解决方案是运行查询两次(一次用于正面评价,一次用于负面评价),然后将它们合并到应用级别。我问你是否有更好、更高效的方法来实现这个结果。 感谢您的建议。

最佳答案

我建议您使用 mapReduce 函数。这是一个可能的解决方案:

var map = function() {
    if (this.positive) {
        emit(this.positive, { positiveCount: 1, negativeCount: 0 });
    }
    if (this.negative) {
        emit(this.negative, { positiveCount: 0, negativeCount: 1 });
    }
};

var reduce = function (key, values) {
     var o = { positiveCount: 0, negativeCount: 0 };
     for (var i = 0; i < values.length; i++) {
         if (values[i].positiveCount === 1) {
             o.positiveCount++;
         }
         if (values[i].negativeCount === -1) {
             o.negativeCount++;
         }
     }
     return o;
};

db.pairs.mapReduce(map, reduce, { out: "solution" } );

现在,您有了正数/负数的总数。查询solution集合,可以看到结果。

关于mongodb - 分组并计算存储在两个单独字段中的 ObjectID 的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38589298/

有关mongodb - 分组并计算存储在两个单独字段中的 ObjectID 的出现次数的更多相关文章

  1. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  7. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  8. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  9. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  10. 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可以方便地让您根据它的“并行赋

随机推荐