0

在使用 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 中完成):

地图:

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"

4

1 回答 1

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;
}
于 2013-07-18T12:29:27.400 回答