2016-01-26 53 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

你能否提供这个问题的链接?我想知道这是怎么回事! –

相关问题