我遇到了一个奇怪的问题。我已经开始使用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) { ... }
来确保我从数据库中获得一个新的。
任何人都有任何想法?如果需要,我会很高兴发布更多代码,我只是试图找到上面最相关的部分,但我可能会遗漏其他地方的某些内容......
答案 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()