Mongoose.js
をnode.js
とともに使用します。
私はこのスキーマを持っています:
var Photo = new Schema({
URL:String
,description:String
,created_by:{type:ObjectId, ref:'User'}
,created_at:{type:Date, default:Date.now()}
});
var User = new Schema({
name:{type:String,index:true}
,email:{type:String,index:true, unique:true}
});
//Task model
var Task = new Schema({
title:String
,created_by:{type:ObjectId, ref: 'User'}
,created:{type:Date, default:Date.now()}
,responses:[{
type:Number
,user:{type:ObjectId, ref: 'User'}
,comment:String
,avatarURL:String
,photo:{type:ObjectId, ref: 'Photo'}
,created:{type:Date, default:Date.now()}
}]
});
//Group model
var Group = new Schema({
name:String
,tasks:[Task]
});
そして、このコードはエラーになります(グループは問題ありません、そのidxでのタスクは問題ありません、応答は空の配列です、ユーザーは有効です、写真は有効です):
var typePhoto = 6;
var resp = {
type: typePhoto//photo
,user: user._id
,photo: photo._id
};
group.tasks[taskIdx].responses.Push(resp); //errors out here
その時点で、次のエラーが発生します。
/home/admin/notitws/node_modules/mongoose/lib/utils.js:434
throw err;
^
CastError: Cast to number failed for value "[object Object]" at path "undefined"
at SchemaNumber.cast (/home/admin/notitws/node_modules/mongoose/lib/schema/number.js:127:9)
at Array.MongooseArray._cast (/home/admin/notitws/node_modules/mongoose/lib/types/array.js:78:15)
at Object.map (native)
at Array.MongooseArray.Push (/home/admin/notitws/node_modules/mongoose/lib/types/array.js:187:23)
at exports.taskAddPhoto (/home/admin/notitws/routes/group.js:1097:35)
at Promise.exports.createPhoto (/home/admin/notitws/routes/photos.js:106:4)
at Promise.addBack (/home/admin/notitws/node_modules/mongoose/lib/promise.js:128:8)
at Promise.EventEmitter.emit (events.js:96:17)
at Promise.emit (/home/admin/notitws/node_modules/mongoose/lib/promise.js:66:38)
at Promise.complete (/home/admin/notitws/node_modules/mongoose/lib/promise.js:77:20)
これを修正する方法や、それを引き起こしている可能性のあるものについてのアイデアはありますか?
PSそれが重要かどうかはわかりませんが、グループを取得するための呼び出しで、tasks.responses.user
とtasks.responses.photo
とtasks.created_by
を入力しています。
「type」キーワードは、フィールドのタイプを決定するためにマングースによって使用されます。マングースはおそらく、応答は配列ではなく数値型であると考えています。
試してください:
responses:[{
type: {type: Number}
,user:{type:ObjectId, ref: 'User'}
,comment:String
,avatarURL:String
,photo:{type:ObjectId, ref: 'Photo'}
,created:{type:Date, default:Date.now()}
}]
もう1つの方法は、応答オブジェクトをスキーマにラップすることです。
responses: [Response]
キャストをobjectIdに修正したものを投稿しています。それは私の機能ドキュメントのupdatedByキーの話です。問題のある領域がキャストの問題に対応していることを示すために、いくつかのコメントを追加しました。
マングースをインポートします。
var mongoose = require('mongoose');
objectIdを定義します。
var ObjectId = mongoose.Schema.Types.ObjectId;
スキーマでタイプを定義します。
var featureSchema = new Schema({
name: String,
isSystem: { type: Number, min: 0, max: 1 },
updatedBy: {type:ObjectId, ref:'users'}, //here I defined the field!
updatedAt: { type: Date, default: Date.now }
});
次に、postメソッドを使用してドキュメントを挿入します。
app.post('/features', function (req, res){
var feature;
console.log("POST: ");
console.log(req.body);
feature = new Feature({
name: req.body.name,
isSystem: req.body.isSystem,
updatedBy: req.body.updatedBy, //here I insert the objectId field
updatedAt: new Date()
});
feature.save(function (err) {
if (!err) {
return console.log("created");
} else {
return console.log(err);
}
});
return res.json({ features: feature });
});
そして最後にこれはあなたのjson文字列です。あなたはグーグルchrome javascriptコンソールまたは同様のものからそれを起動することができます;
jQuery.post("/features", {
"name": "Receipt",
"isSystem": 0,
"updatedBy": "528f3d44afcb60d90a000001"
},function (data, textStatus, jqXHR) {
console.log("Post resposne:"); console.dir(data);
console.log(textStatus);
console.dir(jqXHR);
});