2015-09-18 71 views
4

一個如何將轉換如下:從重新考慮查詢內Rethinkdb轉換對象的數組到單個對象

[{ 
    "name": "annoying data", 
    "status": "evil", 
    "foo": 1, 
    "bar": 2, 
    "baz": 3 
}...] 

[{ 
    "name": "annoying data", 
    "status": "evil", 
    "frustration": [ 
    { 
     "name": "foo", 
     "value": 1 
    }, 
    { 
     "name": "bar", 
     "value": 2 
    }, 
    { 
     "name": "baz", 
     "value": 3 
    } 
    ] 
}...] 

向該輸出?

我們有一個存儲的第三方API響應,我試圖轉換成有用的東西。在我看來,爲了達到理智的數據輸出的最終目標,我需要完成兩件事情。

  1. 變換frustration陣列分爲使用name作爲鍵和value作爲值的對象。
  2. 將新轉換的frustration對象合併到父對象中。

我有步驟2中可能的解決方案:

.map(function(row) { 
    row.pluck('name', 'status').merge(row('frustration')) 
}) 

但我與步驟一一事無成。任何想法都非常感謝!

當前完整的查詢(名稱變更爲保護......我!):

r.db('test').table('evil_things').map(function(row) { 
    var x = row('a')('tree')('children') 
     .nth(0)('children') 
     .nth(0) 
     .map(function(x) { 
      return x('children'); 
     }) 
     .concatMap(function(x) { 
      return x.pluck('name', 'value'); 
     }) 
    ; 

    return { 
    'name': row('name'), 
    'status': row('status'), 
    'frustration': x 
    }; 
}).filter(function(row) { 
    return r.expr(['FOO','BAR','BAZ']).contains(row('name').upcase()); 
}) 
.orderBy('status'); 

回答

3

你是正確的方式。

您可以使用object從鍵值數據列表創建對象。但object收到參數列表,而不是一個陣列,所以你需要args

frustation是與每個文檔作爲對象的數組,你需要一種方法來把它變成扁平化數組列表,從這個陣列意思

[{key1: val1}, {key2: val2},...]

我們把它轉化爲

[key1, val1, key2, val2,...]

進入argsobject。這是concatMap的工作。

讓我們試試這個:

r.expr([{ 
    "name": "annoying data", 
    "status": "evil", 
    "frustration": [ 
    { 
     "name": "foo", 
     "value": 1 
    }, 
    { 
     "name": "bar", 
     "value": 2 
    }, 
    { 
     "name": "baz", 
     "value": 3 
    } 
    ] 
}]) 
.map(function(doc) { 
    return doc.pluck("name", "status").merge(
    r.object(r.args(doc('frustration') 
    .concatMap(function(frustration) { return [frustration("name"), frustration("value")] }) 
    )) 
) 
}) 

結果:

[ 
{ 
"bar": 2 , 
"baz": 3 , 
"foo": 1 , 
"name": "annoying data" , 
"status": "evil" 
} 
] 

希望它能幫助:

+0

真棒謝謝你推動正確的方向。 – scull7

+0

嘿Scull7,你可以閱讀更多關於這本書(我的書btw):https://github.com/kureikain/simplyrethink/ – kureikain

2

像這樣的東西應該工作:

.map(function(row) { 
    return row.pluck('name', 'status').merge(
    row('frustration').map(function(x){ return [x['name'], x['value']]; }).coerceTo('object')) 
}) 
+0

這是真棒!爲我節省了很多時間:)對於JavaScript,它必須是'return [x('name'),x('value')]' – thinklinux