2015-09-26 52 views
0

我有兩個集合與一個,描述,這是父母,與圖像,這是孩子,並引用描述集合。基於這個層次結構,我的集合就像這樣安裝。鑄造錯誤的貓鼬填充方法

描述:(例如文件)

{ 
    "_id": "navy-blue", 
    "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut consequat nunc sit amet massa congue pharetra. Aliquam pretium arcu nec velit accumsan, nec pellentesque mauris porttitor. Donec ultrices interdum mi, in viverra nulla posuere sit amet. Donec quis elit nibh. Cras condimentum aliquam ullamcorper. In blandit, turpis a aliquam laoreet, sapien nunc venenatis nisl, vel blandit massa massa non lacus. Cras tempor enim non consequat iaculis. Curabitur quis urna tellus. Nunc at mattis justo. Donec dolor velit, placerat ut co" 
} 

圖片:(參考descriptions_id,例如文檔)

{ 
    "_id": { 
     "$oid": "55f0e2977f057f0d2f2ce548" 
    }, 
    "pattern": "solid", 
    "propercasePattern": "Solid", 
    "color": "navy-blue", 
    "propercaseColor": "Navy Blue", 
    "imageUrl": "example.com/navy.jpg", 
    "imageSource": "http://test.com/", 
    "descriptions_id": "navy-blue" 
} 

由於這種設置的結果,我想設置我的路線看用於選擇的顏色和圖案,並顯示所有匹配的圖像文檔,同時顯示附加的說明。這個描述需要顏色而不是模式。

這裏是我的路線:(錯誤來自doc.descriptions_id控制檯日誌)

router.get('/:pattern/:color/result', function(req, res){ 

    console.log(req.params.color); 

    Images.find({ pattern: req.params.pattern, color: req.params.color }).populate('descriptions_id').exec(function(err, image, doc){ 
     if (err) { console.log(err); } 
     //console.log(image); 
     console.log(doc.descriptions_id); 
     res.render('pages/suit-result.hbs', { 
      pattern : req.params.pattern, 
      color : req.params.color, 
      image : image 
     }); 
    }); 
}); 

以下是錯誤消息我用我的當前設置得到:

[CastError: Cast to ObjectId failed for value "navy-blue" at path "_id"] 
    stack: 'Error\n at MongooseError.CastError 
message: 'Cast to ObjectId failed for value "navy-blue" at path "_id"', 
    name: 'CastError', 
    kind: 'ObjectId', 
    value: 'navy-blue', 
    path: '_id' } 

爲什麼在失敗那個值,當在貓鼬文件中它顯示你應該使用id命名約定作爲參考點?

UPDATE

描述模型:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var descriptionSchema = new Schema({ 
    color: String, 
    body: String, 
}); 

var Description = mongoose.model('Description', descriptionSchema); 

module.exports = Description; 

圖像模式:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var imageSchema = new Schema({ 
    pattern: String, 
    color: { type: String, ref: 'Description'}, 
    imageName: String, 
    imageUrl: String, 
    imageSource: String 
}); 

var Images = mongoose.model('Images', imageSchema); 

module.exports = Images; 

回答

0

這似乎是您的架構defintions是不正確的,或者至少你有沒有覆蓋的默認處理爲_id。由於您的預期值應該是「顏色」,因此您似乎也會調用錯誤路徑.populate()

這裏有一個例子:

var async = require('async'), 
    mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

mongoose.connect('mongodb://localhost/test'); 

var data = { 
    "_id": "navy-blue", 
    "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut consequat nunc sit amet massa congue pharetra. Aliquam pretium arcu nec velit accumsan, nec pellentesque mauris porttitor. Donec ultrices interdum mi, in viverra nulla posuere sit amet. Donec quis elit nibh. Cras condimentum aliquam ullamcorper. In blandit, turpis a aliquam laoreet, sapien nunc venenatis nisl, vel blandit massa massa non lacus. Cras tempor enim non consequat iaculis. Curabitur quis urna tellus. Nunc at mattis justo. Donec dolor velit, placerat ut co" 
}; 


var descriptionSchema = new Schema({ 
    _id: String, 
    body: String 
},{ _id: false }); 

var imageSchema = new Schema({ 
    color: { type: String, ref: 'Description' }, 
    propercaseColor: String 
}); 

var Description = mongoose.model('Description',descriptionSchema), 
    Image = mongoose.model('Image',imageSchema); 


async.series(
    [ 
    function(callback) { 
     async.each([Description,Image],function(model,callback) { 
     model.remove({},callback); 
     },callback); 
    }, 

    function(callback) { 
     async.waterfall(
     [ 
      function(callback) { 
      Description.create(data,callback); 
      }, 
      function(desc,callback) { 
      Image.create({ 
       "color": desc, 
       "propercaseColor": "Navy Blue" 
      },function(err) { 
       callback(err); 
      }); 
      } 
     ], 
     callback 
    ); 
    }, 
    function(callback) { 
     Image.find().populate('color').exec(function(err,doc) { 
     console.log(doc); 
     callback(err); 
     }); 
    } 
    ], 
    function(err) { 
    if (err) throw err; 
    mongoose.disconnect(); 
    } 
); 

它返回填充對象:

[ { _id: 56060d1812966d29622f8a04, 
    color: 
    { _id: 'navy-blue', 
     body: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut consequat nunc sit amet massa congue pharetra. Aliquam pretium arcu nec velit accumsan, nec pellentesque mauris porttitor. Donec ultrices interdum mi, in viverra nulla posuere sit amet. Donec quis elit nibh. Cras condimentum aliquam ullamcorper. In blandit, turpis a aliquam laoreet, sapien nunc venenatis nisl, vel blandit massa massa non lacus. Cras tempor enim non consequat iaculis. Curabitur quis urna tellus. Nunc at mattis justo. Donec dolor velit, placerat ut co', 
     __v: 0 }, 
    propercaseColor: 'Navy Blue', 
    __v: 0 } ] 

當然沒有.populate()它只是存儲在圖像集合中的「顏色」的值:

[ { _id: 56060d5f81fff8356262d711, 
    color: 'navy-blue', 
    propercaseColor: 'Navy Blue', 
    __v: 0 } ] 

因此,請確保您的架構正確定義爲「r ef「模型,當然在鏈接模型中,_id被設置爲正確的類型,當然配置通過{ _id: false }禁用ObjectId創建和投射。

+0

嘿@布萊克斯七,謝謝你的詳細解答。我正在嘗試構建命令行方法來對文檔進行更新,而不是執行異步回調並創建新文檔。我不打算向我的收藏中添加任何新文檔,但要修改以使引用正確。基於此,它似乎並不像我可以運行'.update',因爲它不會更改記錄的'Id' – cphill

+0

我也用我的兩個模型文件更新了我的問題,儘管我已經添加了來自。json文件,並沒有真正利用這些模型與我的路由。模型文件也根據您建議的參考字段進行了更改。 'descriptions_id'已被刪除。 – cphill

+0

@cphill Mongoose和mongodb「需要」_id'字段,因爲它是主鍵。這裏的內容的重點是你遵循它而不是自己制定方法,因爲這是可行的結構,而嘗試任何不同的理由不會。您的其餘評論談論的問題超出了這個問題的範圍。如果你有其他問題,那麼你[問另一個問題](http://stackoverflow.com/questions/ask)。 StckOverflow是針對特定的問題和答案,而不是一個線程討論板。 –