我有一个包含以下架构的集合:
// ----- 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
对此进行归档?这种方法的表现更好吗?
答案 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限制,因为您实际上要求所有中的数据库对象聚合<仅限一个文档。