2016-01-26 55 views
3

我有一個現成的MongoDB集合基本上是看起來像:帆和子文檔的ObjectId()

users: [ 
{ 
    "_id": ObjectId("56a6f714a2c56f1c3b0f17f1"), 
    "name": "Daniel", 
    "phones" : [ 
     { 
      "_id": ObjectId(""56a78dd1879c40ea63822141"), 
      "areacode": 333, 
      "number": 111111111 
     }, 
     { 
      "_id": ObjectId(""56a78dd1879c40ea63822141"), 
      "areacode": 111, 
      "number": 99999999 
     } 

    ] 

}, 
{ 
    "_id": ObjectId("56a6f714a2c56f1c3b0f17f1"), 
    "name": "John", 
    "phones" : [ 
     { 
      "_id": ObjectId(""56a78dd1879c40ea63822141"), 
      "areacode": 333, 
      "number": 111111111 
     }, 
     { 
      "_id": ObjectId(""56a78dd1879c40ea63822141"), 
      "areacode": 111, 
      "number": 99999999 
     } 
    ] 

} 
] 

正如你所看到的,我使用的子文檔對象ID與一個外部涉及此數據收集我們存儲數字的附加信息。所有這些ID都是由Mongoose自動在其他應用程序中自動生成的。

現在,在Waterline中,不存在對子文檔的模式支持,因此在對集合執行find()時,子文檔ObjectId將作爲JSON而不是ID字符串返回。

這導致類似

results: [ 
{ 
    "id": "56a6f714a2c56f1c3b0f17f1", 
    "name": "Daniel", 
    "phones" : [ 
     { 
      "_id": { 
       "_bsontype": "ObjectID", 
       "id": "V§zÐ\u0019}dÒÏ_" 
      } 
      "areacode": 333, 
      "number": 111111111 
     }, 
     { 
      "_id": { 
       "_bsontype": "ObjectID", 
       "id": "V§zÐ\u0019}dÒÏ_" 
      } 
      "areacode": 111, 
      "number": 99999999 
     } 

    ] 

} 
] 

貓鼬處理這種優雅,而你總是可以擁有這些標識的可在客戶端進行相關查詢,但水線,並沒有嵌套模式,這似乎成爲另一個死衚衕。

有什麼辦法來解決這個沒有返回之前遍歷整個集合,必須遷移數據庫,更改文件或有正常化的地獄的數據庫?這些數據是由幾個應用程序訪問,並需要保持原樣。

+0

順便說一句,做用.native(搜索),並返回該ID的預期,但隨後如果我不得不使用.native()一個簡單的發現,什麼是具有水線點?使用一些其他的實際上是爲MongoDB設計的ORM,比如Mongoose,會不會更好? – afterxleep

回答

1

可能有更好的方法來做到這一點,但最終我決定遞歸迭代返回的JSON,用合適的ObjectID替換ID,這要歸功於bson-objectid庫。

我基本上都在模型級別呼籲的toJSON函數這個方法:

// Recursively iterate over a JSON object 
function replaceBSONIDs(object){ 

    var ObjectID = require("bson-objectid"); 

    for(var x in object){ 

    if(typeof object[x] == 'object') { 
     replaceBSONIDs(object[x]); 
    } else { 

     // Perform the actual replace of the _id with an object ID 
     if('_id' in object) { 
      object.id = ObjectID(object._id.id); 
      delete object._id   
    } 
    } 

} 

這個問題聽起來像一個水線錯誤,所以打開的問題。希望這可以幫助別人。

+0

你能否提供這個問題的鏈接?我想知道這是怎麼回事! –

相關問題