![](/img/trans.png)
[英]Convert flat array [k1,v1,k2,v2] to object {k1:v1,k2:v2} in JavaScript?
[英]MongoDB transform [{k1:v1},{k2:v2}] into {v1: v2}
我有一个具有以下架构的集合:
// ----- 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
使用only Mongodb queries
存档? 这种方法的性能更好吗?
使用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的限制,因为实际上您仅要求将所有 DB对象聚合到一个文档中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.