正如标题所说。
更多上下文:我有一个小脚本(由php通过exec启动),它将搜索具有给定id的章节,对图像进行一些更改(加扰它们),我没有设法做在php(我是新手使用文件)。
这是我的架构
//instantiate mongoose-gridfs
var gridfs = require('mongoose-gridfs')({
collection:'files',
mongooseConnection: mongoose.connection
});
//Files = gridfs.model;
var FilesSchema = gridfs.schema;
FilesSchema.add({
_id: Schema.Types.ObjectId,
name: String,
mime: String,
filename: String,
type: String
});
Files = mongoose.model('Files', FilesSchema);
var pageSchema = Schema({
order: Number,
image: { type: Schema.Types.ObjectId, ref: 'Files' },
scrambled: Boolean
});
var ChapterSchema = Schema({
_id: Schema.Types.ObjectId,
pages: [pageSchema]
});
var Chapter = mongoose.model('Chapter', ChapterSchema, "Chapter");
当我这样做时
Chapter.findById(chapterId)
.populate('pages.image')
exec(...
它引发了CastError:{ CastError: Cast to ObjectId failed for value "DBRef ...
错误对象很长,所以我不在这里粘贴它
但这是一个带有完整错误消息/对象
https://pastebin.com/8n54Dhzt
如果我是chan,ge是Image to Array的类型,我可以访问我需要的属性,但在这种情况下,我无法正确地重置图像(它在db而不是Ref上写入数组)< / p>
我的参考文献位于embeddedDocument中,就像那样
Chapter.pages[0].image
image是具有引用的属性。
我真的不明白为什么会出现这个错误,我按照参考/填充的文档进行了说明:http://mongoosejs.com/docs/populate.html
PS:一个重要的细节,参考文献由DoctrineODM保存。 我使用我的节点脚本来修改/加密图像,然后在我的应用程序中恢复js中的加密。
PS2:抱歉,如果已经发布并回答了类似的问题,那么有很多帖子都有相同的错误&#39; Cast to ObjectId的值为&#39;我承认我没有读过所有这些内容,但我读过的内容并没有帮助我。
编辑:更新我的代码以使用mongoose-gridfs模型而不是另一个+使用subDocument代替对象数组
答案 0 :(得分:0)
这似乎是chapterId
值的错误。使用collection.findById
时,传递的值必须通过ObjectId
条件
如果你传递的id不能构造成上面描述的模式,那肯定会抛出像你一样的错误。
因此,请确保chapterId
正确或与您从数据库中获取的内容相同