MongoDB Mapreduce:对Mapreduce的结果进行查询/限制/过滤?

MongoDB Mapreduce:对Mapreduce的结果进行查询/限制/过滤?,mongodb,filter,mapreduce,Mongodb,Filter,Mapreduce,在使用map_reduce查询mongoDB数据库时,我需要限制实际结果。我希望使用query选项,但这仅限制map部分中的数据。我需要限制输出 我的数据如下所示(省略了其他属性): 我的对象在每个版本中共享相同的名称(每次更新都会增加) 我需要获得每个对象的最新版本,并且我已经编写了map/reduce函数(在mongomapper中完成): 地图: function() { emit(this.name, this); } function(key, values) { var r

在使用map_reduce查询mongoDB数据库时,我需要限制实际结果。我希望使用
query
选项,但这仅限制
map
部分中的数据。我需要限制输出

我的数据如下所示(省略了其他属性):

我的对象在每个版本中共享相同的
名称
(每次更新都会增加)

我需要获得每个对象的最新版本,并且我已经编写了map/reduce函数(在mongomapper中完成):

地图:

function() {
  emit(this.name, this);
}
function(key, values) {
  var res = values[0];
  for(var i=1; i<values.length; i++)
  {
    if(values[i].version >res.version)
    {
      res = values[i];
    }
  }
  return res;
}
减少:

function() {
  emit(this.name, this);
}
function(key, values) {
  var res = values[0];
  for(var i=1; i<values.length; i++)
  {
    if(values[i].version >res.version)
    {
      res = values[i];
    }
  }
  return res;
}
预期结果是一个空结果,因为最新版本没有将
someAttr
设置为
“a”
。我得到的是版本1的obj1


如何将输出仅限于
someAttr
设置为
“a”
的对象?

您可以添加到reduce函数中

function(key, values) {
  var res = values[0];
  for(var i=1; i<values.length; i++)
  {
    if(values[i].version >res.version)
    {
      res = values[i];
    }
  }
  if ('someAttr' in res && res.someAttr == "a")
  return res;
}
函数(键、值){
var res=数值[0];
对于(变量i=1;ires.version)
{
res=数值[i];
}
}
if('someAttr'在res&&res.someAttr==“a”)中)
返回res;
}
或者,如果您想在someAttr设置为“a”的版本之间检查最新版本,您可以这样做

function(key, values) {
  var res = {version : 0}
  for(var i=0; i<values.length; i++)
  {
    if('someAttr' in res && res.someAttr == "a" && values[i].version >res.version)
    {
      res = values[i];
    }
  }
  return res;
}
函数(键、值){
var res={version:0}
对于(变量i=0;ires.version)
{
res=数值[i];
}
}
返回res;
}

您是否考虑过使用聚合框架而不是MapReduce?您可以使用查询进行筛选,然后按版本对结果进行排序。@wiredparie我实际使用的框架是一个名为mongomapper的Ruby框架。它并不真正支持聚合框架。另外,我需要一个集合中每个对象的最高版本,而不仅仅是一个结果。对不起,我不了解您的数据。聚合框架可以返回每个对象(例如按
name
分组)。您可以使用
MongoMapper.database.command
并传入
'aggregate'
和管道。您的方式太字面化了,它必须是动态的。它需要类似于where查询,在这里我指定哪个属性有什么值。但是map/reduce不接受参数。map-reduce通过作用域接受参数。您可以检查一下,只需将作用域{someAttr:“a”}添加到您的mapreduce请求中(与您的查询一起,例如{query:{…},scope:{…}),然后您就可以在javascript mapreduce代码中使用someAttr作为变量。这是一个很好的建议!