mongoose populate返回空

时间:2016-12-13 04:02:42

标签: node.js mongodb mongoose

在mongoose中,目前我有2个架构,第一个是产品详细信息,第二个是库存,两个架构都是单独的文件

ProductDetail Schema

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var productDetailSchema = new Schema({
    ProductID:{type:String,unique:true, require:true},
    ProductName:{type:String, require:true},
    Spec:String,
    Price:String,
    Unit:String,
    OwnBrand:Boolean,
    Inventory:{ type: Schema.Types.ObjectId, ref: 'inventoryModel'}
}, {collection:'products'});


module.exports = mongoose.model('productDetailModel', productDetailSchema)

库存模式

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var inventorySchema = new Schema({
    product:{ type: Schema.Types.ObjectId, ref: 'productDetailModel' },
    stockLevel:Number
}, {collection:'inventory'});

module.exports = mongoose.model('inventoryModel', inventorySchema)

在这种情况下,我想将库存stockLevel放入productDetail。喜欢这个

{
    ProductID:'P701',
    ProductName:'popcorn',
    Spec:'Large Pack',
    Price:'10.00',
    Unit:'packs'
    Inventory: 20
}

因此我尝试使用mongoose populate方法

productDetail.findOne({ProductID:'P701'}).populate('Inventory').exec(function(err, doc){
    if(err){
        console.log(err)
    }else{
        console.log(doc)
    }
})

这是我在"库存集合中的数据"

{
    "_id" : ObjectId("584f663d95dfa29bad337572"),
    "ProductID": "P701",
    "StockLevel": "20"
}

和" ProductDetail Collection"

中的数据
{
    _id : ObjectId("584a3cea027c1f62da941acf"),
    ProductID:'P701',
    ProductName:'popcorn',
    Spec:'Large Pack',
    Price:'10.00',
    Unit:'packs'
}

由于某种原因,没有出现错误但是console.log(doc)仍然没有包含任何Inventory:stockLevel。我知道我做错了什么,但我不知道它在哪里。为了使这段代码有效,我缺少什么样的关键概念?提前谢谢

1 个答案:

答案 0 :(得分:0)

inventory中的productDetailModel应该是ObjectId,您在此处显示的是一个数字(即20)。

{
    ProductID:'P701',
    ProductName:'popcorn',
    Spec:'Large Pack',
    Price:'10.00',
    Unit:'packs'
    Inventory: 20
}

这应该是这样的:

Inventory : ObjectId('someId');

这就是为什么它没有填充,因为它在ObjectId中找不到inventoryModel为20。

修改

productDetail文档没有inventory字段。因此,它无法填充它。

{
    _id : ObjectId("584a3cea027c1f62da941acf"),
    ProductID:'P701',
    ProductName:'popcorn',
    Spec:'Large Pack',
    Price:'10.00',
    Unit:'packs'
}

它也应该有这样的东西:

inventory :  ObjectId("584f663d95dfa29bad337572");//some `ObjectId` which corresponds to `inventoryModel` document.

您需要创建广告资源field并在productDetail文档中保存某些广告资源文档,同时保存它,或者可能在更新时。