2015-09-26 51 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是针对特定的问题和答案,而不是一个线程讨论板。 –