我有一个问题,如果我尝试将新的ref属性保存到现有文档,我会收到castId错误,但是如果我最初使用该文档属性集创建该文档,则此相同的更新可以正常工作。
让我试着解释一下:
我有一个这样的架构:
name: String,
desc: String,
user: {
type: ObjectId,
ref: 'User'
}
现在,如果我创建一个设置了'user'值的新文档,我可以自由更新它。但是,如果我创建没有“用户”值的文档,然后尝试使用用户值更新它,我会得到一个
'施放到ObjectId失败的值“[object Object]”'
我发送回我的函数的数据在两种情况下都是相同的,这是一个带有'_id'字段的JSON对象。
当我第一次创建它时,我所做的就是自己将'user'设置为objectID值,但之后我可以发送一个带有_id的JSON对象,它可以正常更新(如果已经在创建时设置了值) )。
我做错了吗?有一个更好的方法吗?我的更新代码非常简单:
myModel = _.extend(myModel, req.body);
myModel.save()
首次添加文档时,我的创建代码也很简单:
var model = new Model(req.body);
model.save()
我可以通过在运行_.extend操作之前将req.body.user设置为'_id'来解决这个问题,只有当它还不存在时。它不是理想的,感觉有点hacky但我觉得它有效。
然而,当我处理包含ref的嵌入对象数组时遇到相同的错误时,这会变得更加麻烦......现在肯定不是检查每个更新操作,而是在数组上有一个新项目,转换手动将所有'Ref'属性赋予ObjectId ....
不能猫鼬自动检测'_id'字段,抓住它并将其存储为参考? 为什么这个字段最初是在文档创建时设置的呢?
因此,如果它是在创建时设置的,那么即使发送整个JSON对象,它也只会在我尝试添加新字段或新数组条目(包含带有ref的对象)时发生,我才会收到此错误。
用ref:
显示嵌入式数组doc的含义{
myProp: String,
myDetails: [{
name: String,
myUser: {
type: ObjectId,
ref: 'User'
}
}]
我希望我在这里有意义吗?如果没有,请告诉我是否有任何令人困惑的事情。
答案 0 :(得分:0)
发生这种情况的主要原因是期待一种类型的对象ID'。如果您创建一个新的Mongoose模型并将其分配给' ref'这通常不会发生。字段比mongoose足够聪明,可以识别它并只提取“对象”。从它。
有两种方式:
1)亲自手动完成:
MyModel.refField = mongoose.Types.ObjectId(myString)
2)获取模型并分配它:
var myModel = MyModel.findById(myString); MyModel.refFeild = myModel;