2015-11-13 57 views
1

尝试什么似乎像一个相当简单的创建使用对象:猫鼬创建包含对象数组记录(投射到阵列失败)

var toSave = { 
    person_number: "rjq8900", 
    person_name: "john smith", 
    cars: [{ 
    car_id: "fordTaurus1994", 
    make: "ford", 
    model: "taurus", 
    purchased: "31-Aug-15", 
    price: "1650" 
    }] 
} 

到模式:

var People = new Schema({ 
    person_number: String, 
    person_name: String, 
    cars:[{ 
    car_id: String, 
    make: String, 
    model: String, 
    purchased: Date, 
    price: Number 
    }] 
}) 

经由:

People.create(toSave, function(e, doc){ 
    console.log(e); 
}); 

我得到:

errors:{ 
    cars:{ 
    [CastError: Cast to Array failed for value "[object Object]" at path "cars"] 
    } 
} 

我在这里丢失了明显的东西吗?

编辑 在我的示例中添加了“car_id”字段。我的实际架构/文档很大,并且有些动态创建。我试图尽可能精确,而不是为了披露目的而过于准确。我无法在此发布实际数据。

+0

@inspired没想好。我试了一下,并确认日期对象正确传递。不幸的是,我仍然遇到同样的错误。 –

回答

1

根据docs,你应该处理您的嵌入文档,像这样:

var Cars = new Schema({ 
    car_id: String, 
    make: String, 
    model: String, 
    purchased: Date, 
    price: Number 
}); 

var People = new Schema({ 
    person_number: String, 
    person_name: String, 
    cars:[Cars] 
}); 

mongoose.model('People',People); 

这样你的文件的人的cars键则是DocumentArray的 实例。这是一个特殊的子类Array可以 处理casting,并有特殊的方法来处理嵌入式 文件。

然后,您可以添加一个文件的汽车,像这样:

// retrieve my model 
var Car= mongoose.model('Car'); 

// create a person 
var person = new Person(); 

// push car 
person.cars.push(
{ 
    car_id: "fordTaurus1994", 
    make: "ford", 
    model: "taurus", 
    purchased: "31-Aug-15", 
    price: "1650" 
    } 
); 

person.save(function (err) { 
    if (!err) console.log('Success!'); 
}); 
+0

不得不修改大量的东西(我的半动态模式读取器依赖于'schema.tree'的一些东西),但是这个工作非常好!谢谢,我已经在这个几个小时了。 –