MongoDB将[{k1:v1},{k2:v2}]转换为{v1:v2}

时间:2015-05-27 18:11:51

标签: javascript node.js mongodb

我有一个包含以下架构的集合:

// ----- SOURCE SCHEMA ----- //

{
    "_id" : ObjectId("5564e8937c32c85f03ea028a"),
    "sku" : "MD01"
},
{
    "_id" : ObjectId("5564e8c97c32c85f03ea028b"),
    "sku" : "MD02"
},
{
    "_id" : ObjectId("5564e8dd7c32c85f03ea028c"),
    "sku" : "MD03"
}

// ----- SOURCE SCHEMA ----- //

现在我想将这些文档转换为以下格式:

// ----- DESIRED FORMAT ----- //

{
    "5564e8dd7c32c85f03ea028c": "MD01",
    "5564e8c97c32c85f03ea028b": "MD02",
    "5564e8dd7c32c85f03ea028c": "MD03"
}

// ----- DESIRED FORMAT ----- //

目前我必须在服务器端javascript中使用两个for loop来执行此任务,但我认为如果集合变大,它将面临性能问题。

那么如何使用only Mongodb queries对此进行归档?这种方法的表现更好吗?

1 个答案:

答案 0 :(得分:2)

使用Map-Reduce可以实现所需的输出:

// map each object to { "XXXXXXXX": sku }
map = function() {
  obj = {}
  obj[this._id.valueOf()] = this.sku
  emit(null, obj)
}

// Aggregate all objects in one (very?) big one
// by copying individual properties
reduce = function(key, values) {
  result = {}
  for (idx in values) {
    for (k in values[idx]) {
      result[k] = values[idx][k]
    }
  }

  return result
}

产:

> db.test.mapReduce(map, reduce, {out: {inline:1}}).results
[
    {
        "_id" : null,
        "value" : {
            "5564e8937c32c85f03ea028a" : "MD01",
            "5564e8c97c32c85f03ea028b" : "MD02",
            "5564e8dd7c32c85f03ea028c" : "MD03"
        }
    }
]

话虽如此,这效率最高,并且最终会达到16M限制,因为您实际上要求所有中的数据库对象聚合<仅限一个文档。