Mongoose MongoDB对象未定义

时间:2016-11-08 21:10:33

标签: node.js mongodb mongoose mongoose-schema mongoose-populate

我遇到了一个奇怪的问题。我已经开始使用MongoDB,而且我很可能做了一些可怕的错误。

我有以下模型设置:

var cartSchema = mongoose.Schema({
    owner: { type: Schema.Types.ObjectId, ref: 'users' },
    productline:  [{ type: Schema.Types.ObjectId, ref: 'Productline' }]
});

var productlineSchema = mongoose.Schema({
    cart: { type: Schema.Types.ObjectId, ref: 'Cart' },
    product: { type: Schema.Types.ObjectId, ref: 'products' },
    quantity: Number
});

最初,当用户注册时,购物车设置为空数组,但之后我们会向其添加Productline对象(因为我可以在GUI中看到数据,因此可以使用)。

我正在尝试从购物车 - >中读取要达到的名称值。产品线 - >产品

for (var i=0; i < cartModel.productline.length; i++) {
    console.log(cartModel.productline[i].product.name);
}

但是获取 TypeError:无法在该行上读取未定义的属性“name”,这意味着 product ==“undefined”

但是,当我使用MongoDB Compass检查我的MongoDB时,我可以看到它们之间存在实际连接,并且就我所知,id看起来很准确,所以它应该能够读取它

所以要么我试图以错误的方式达到价值,cartModel.productline[0].product.name

或者我的代码没有意识到对象已经更新,这很奇怪,因为我甚至确保使用Cart.findOne(query, function(err, cartModel) { ... }来确保我从数据库中获得一个新的。

任何人都有任何想法?如果需要,我会很高兴发布更多代码,我只是试图找到上面最相关的部分,但我可能会遗漏其他地方的某些内容......

2 个答案:

答案 0 :(得分:0)

我实际上自己设法解决了这个问题。对于遇到嵌套对象问题的人,我建议您查看mongoose-deep-populate插件:https://github.com/buunguyen/mongoose-deep-populate

它给了我很多帮助,我的最终查询结果如下:

Cart.findOne({_id: cart}).deepPopulate('productline.product').exec(function (err, docs) {
    // docs is JSON data which can be used to reach the nested data.
});

答案 1 :(得分:0)

我最近也遇到过类似的错误

演示

我使用时:.populate('productline')

Cart.findOne({_id: cart}).populate('productline').exec(function(err, docs) {
   /* docs.productline items represent the correct model but their 
      fields are undefined except the `_id` */
})

解决方案

我使用时:.populate({path: 'productline'})

Cart.findOne({_id: cart}).populate({path: 'productline'}).exec(function(err, docs) {
   /* docs.productline items represent the correct model with all properties
      fetched with the correct values */
})

其他解决方案

http://mongoosejs.com/docs/populate.html的这个例子帮助了我

Story
    .find(...)
    .populate({
        path: 'fans',
        match: { age: { $gte: 21 }},
        select: 'name -_id', /* populates only these fields in the `fans` collection */
        options: { limit: 5 }
    })
    .exec()