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



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

我的数据看起来像这样(不包括其他属性):

 obj1: { name: "obj1", version: 1, someAttr = "a" }, 
 obj1a: { name: "obj1", version: 2, someAttr= "b"},
 obj2: { name: "obj2", version: 1 }, 
 obj2a: { name: "obj2", version: 2} ...

我有每个版本共享相同name的对象(每次更新都增加)。

我需要得到每个对象的最新版本,我已经写了map/reduce函数(它在monomapper中完成):

地图:

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;
}

现在,我需要不时地限制结果,我只使用query选项。IT工作得很好,除了一个用例:

我需要最新版本的obj1,也有someAttr设置为"a"

我在query中尝试的是:

name: "obj1", someAttr: "a"

预期结果空结果,因为最新版本没有将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;
}

或者如果你想检查最新版本只是那些将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;
}

相关内容

  • 没有找到相关文章

最新更新