MongoDB Mapreduce:查询/限制/过滤mapreduce的结果?

时间:2013-06-10 14:09:03

标签: mongodb filter 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函数(它是在mongomapper中完成的):

MAP:

function() {
  emit(this.name, this);
}

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];
    }
  }
  return res;
}

现在我不时需要限制结果,我为此{j} {j}选项。除了一个用例外,它工作正常:

我需要将query设置为someAttr的最新版本的obj1。

所以我在"a"尝试的是:

query

预期结果空结果,因为最新版本的name: "obj1", someAttr: "a" 未设置为someAttr。我得到的是版本1的obj1 ......

如何将输出仅限制为"a"设置为someAttr的对象?

1 个答案:

答案 0 :(得分:2)

您可以添加到缩小功能

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