非常简单的问题,浪费我的时间几个小时:我只是尝试将数据推送到我的架构中存在的数组但是当我使用.push
我得到错误'无法读取未定义的属性推送'这是我非常简单的代码:
var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/new_try1");
var productSchema = new mongoose.Schema({
number: Number,
name: String
});
var Product = mongoose.model("Product", productSchema);
var orderSchema = new mongoose.Schema({
number: Number,
name: String,
products: [productSchema]
});
var Order = mongoose.model("Order", orderSchema);
var newOrder = new Order({
number: "123",
name: "jane"
});
newOrder.save(function (err, order) {
if (err) {
console.log(err);
} else {
console.log(order);
}
});
Order.find({
name: 'jane'
}, function (err, order) {
if (err) {
console.log(err)
} else {
console.log(order);// I can see the products array in cmd
console.log(order.products);// I got undefined here!!!!!????
order.products.push({// here I got error can not read of un....
number:456,
name:'carret'
});
order.save(function(err,found){
if (err){
console.log(err);
}else{
console.log(found);
}
})
}
});
当运行服务器时,我在cmd中得到了这个命令:
[{_id:357636shgs65dh5sd4h65d,
number:'123',
name:'jane',
__v:0,
products:[] }]
现在为什么order.product在我在这里看到时是未定义的?
答案 0 :(得分:1)
为了简单起见,看起来顺序就是这样:
var order=[
{_id:357636shgs65dh5sd4h65d,
number:'123',
name:'jane',
__v:0,
products:[]
}];
正如您可以看到 Array 而不是 Object 。所以你首先需要得到数组的对象:
order //the array
[0] //the object
.products //the product array
.push()//should work now
collection.find 将光标返回到集合,需要迭代(= Arraylike) 所以你可能想用 collection.findOne 只返回一个元素,使您的代码有效。
https://docs.mongodb.com/v3.2/reference/method/db.collection.find/ https://docs.mongodb.com/v3.2/reference/method/db.collection.findOne/
Order.findOne({
name: 'jane'
}, function (err, order) {
order.push("data");
});
答案 1 :(得分:0)
看起来您的订单是一个数组。所以像这样的事情应该有效:
Order.find({
name: 'jane'
}, function (err, order) {
if (err) {
console.log(err)
} else {
console.log(order);// I can see the products
console.log(order[0].products);
order[0].products.push({
number:456,
name:'carret'
});
order.save(function(err,found){
if (err){
console.log(err);
}else{
console.log(found);
}
})
}
});
注意:我不确定你的用例。但看起来您可以从数据库中检索多个订单,因此您可能希望循环返回处理的订单