我在JavaScript和Node JS中的数组有一个奇怪但简单的问题



非常简单的问题,这些问题浪费了我几个小时的时间:我只是尝试将数据推到我的模式中存在的数组,但是当我使用.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:[] }]

现在为什么订单。

使其简单,看起来订单就是这样:

var order=[
       {_id:357636shgs65dh5sd4h65d,
           number:'123',
           name:'jane',
           __v:0,
           products:[] 
        }];

您可以看到它的 array 而不是对象。因此,您首先需要获取数组的对象:

order //the array
  [0] //the object
  .products //the product array
  .push()//should work now

collection.find 将光标返回到集合,需要迭代(= arraylike(所以你可能想使用 collection.findone wich仅返回一个元素,使您的代码正常工作。

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");
});

看起来您的订单是一个数组。因此,像这样的事情应该有效:

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);
            }
        })
    }
});

注意:我不确定您的用例。但是看来您可以从数据库中退回多个订单,因此您可能想循环循环返回的处理订单

最新更新