草庐IT

arrays - MongoDB - 对数组参数元素进行操作查询

coder 2023-10-28 原文

我是 MongoDB 的新手,我想弄清楚我是否可以使用 MongoDB 方便地执行此查询并获得良好的性能。我想将数字和数组参数传递给查询,并使用它们对集合中每个文档中的数组值逐个元素地执行操作。这可能吗?

例如集合包含如下文档:

{
    "name" : "item1",
    "m" : 5.2,
    "v" : 1.1,
    "data1" : [ 0, 0, 0.3, 0.7, 0.95, 0.9, 0.75, 0.4, 0.1, 0 ],
    "data2" : [ 0, -1, 0, 1, 1, 0 ]
}

我还有另一个“搜索”文档,可能看起来像这样:

{
    "x" : 8,
    "K" : 1,
    "dataA" : [ 0, 0, 0, 0, 0, 0, 0, 0.5, 1, 0.5],
    "dataB" : [ 0, -2, 0, 1, 1, 0 ]
}

我想运行一个查询,或 map-reduce,使用上面的搜索文档对上面的集合返回一个集合包含:

{
    "name",
    "y" = fn(m, v, x, K) = Kvx^(1/m) (not the real formula but just an example)
    "dataF" = Max(i=0..9) {data1[i] * dataA[i] }
    "dataS" = Sum(j=0..5) {data2[j] * dataB[j] }
}
where y>0

所以对于上面的例子,返回的结果是

{
    "name" : "item1",
    "y" : 1 * 1.1 * 8^5.2 = 1.641
    "dataF" : Max(..., 0.4*0.5, 0.1*1, 0 * 0.5 ) = 0.2
    "dataS" : 0*0 + (-1)*(-2) + 0*0 + 1*1 + 1*1 + 0*0 = 4
}

使用 MongoDB 是否可能/方便?

注意:在我的应用程序中,使用标准 MongoDB 操作的搜索中将包含更多标准条件,因此我希望在查询中包含上述处理,并避免在客户端执行此操作。

最佳答案

这是一个 map/reduce 版本:

db.data.save({
  "name" : "item1",
  "m" : 5.2,
  "v" : 1.1,
  "data1" : [ 0, 0, 0.3, 0.7, 0.95, 0.9, 0.75, 0.4, 0.1, 0 ],
  "data2" : [ 0, -1, 0, 1, 1, 0 ]
});

db.data.mapReduce( function() {
  var searchdoc = {
    "x" : 8,
    "K" : 1,
    "dataA" : [ 0, 0, 0, 0, 0, 0, 0, 0.5, 1, 0.5],
    "dataB" : [ 0, -2, 0, 1, 1, 0 ]
  };

  var result = {name: this.name};
  result.y = searchdoc.K * this.v * Math.pow(searchdoc.x, 1 / this.m);
  if(result.y > 0) {
    result.dataF = 0;
    for(i=0;i<this.data1.length;i++) {
      var f = this.data1[i] * searchdoc.dataA[i];
      if(f > result.dataF) {
        result.dataF = f;
      }
    } 
    result.dataS = 0;
    for(i=0;i<this.data2.length;i++) {
      var s = this.data2[i] * searchdoc.dataB[i];
      result.dataS += s;
    } 
    emit(this.name, result);
  }
}, function(key, values){}, {out: {inline: 1}});

结果:

{
"results" : [
    {
        "_id" : "item1",
        "value" : {
            "name" : "item1",
            "y" : 1.640830939540542,
            "dataF" : 0.2,
            "dataS" : 4
        }
    }
],
"timeMillis" : 0,
"counts" : {
    "input" : 1,
    "emit" : 1,
    "reduce" : 0,
    "output" : 1
},
"ok" : 1,
}

这是 shell 版本:

db.data.save({
  "name" : "item1",
  "m" : 5.2,
  "v" : 1.1,
  "data1" : [ 0, 0, 0.3, 0.7, 0.95, 0.9, 0.75, 0.4, 0.1, 0 ],
  "data2" : [ 0, -1, 0, 1, 1, 0 ]
});

var searchdoc = {
  "x" : 8,
  "K" : 1,
  "dataA" : [ 0, 0, 0, 0, 0, 0, 0, 0.5, 1, 0.5],
  "dataB" : [ 0, -2, 0, 1, 1, 0 ]
};

var search = function(searchdoc) {
  db.data.find().forEach(function(obj) {
    var result = {name:obj.name};
    result.y = searchdoc.K * obj.v * Math.pow(searchdoc.x, 1 / obj.m);
    if( result.y > 0 ) {
      result.dataF = 0;
      for(i=0;i<obj.data1.length;i++) {
        var f = obj.data1[i] * searchdoc.dataA[i];
        if(f > result.dataF) {
          result.dataF = f;
        }
      } 
      result.dataS = 0;
      for(i=0;i<obj.data2.length;i++) {
        var s = obj.data2[i] * searchdoc.dataB[i];
        result.dataS += s;
      } 
      db.results.save(result); 
    }
  });
}

search(searchdoc);

db.results.find();
{ "_id" : ObjectId("4f08ffe4264d23670eeaaadf"), "name" : "item1", "y" : 1.640830939540542, "dataF" : 0.2, "dataS" : 4 }

关于arrays - MongoDB - 对数组参数元素进行操作查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8774585/

有关arrays - MongoDB - 对数组参数元素进行操作查询的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

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

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

  4. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  5. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  6. 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您的程序将作为解释器的子进程执行。除

  7. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  8. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  9. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  10. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

随机推荐