【问题标题】:mongoose populate return empty猫鼬填充返回空
【发布时间】:2016-12-13 12:56:03
【问题描述】:

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

ProductDetail 架构

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
}

因此我尝试使用猫鼬填充方法

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。我知道我做错了什么,但我不知道它在哪里。为了让这段代码正常工作,我缺少什么样的关键概念?提前谢谢你

【问题讨论】:

  • 您能说明您是如何将inventoryModel _id 保存在productDetailModel 中的吗?
  • 请把ProductId:'P701'的productDetail中的内容贴出来好吗?您似乎在保存产品详细信息时存储了无效的库存 refId。

标签: node.js mongodb mongoose


【解决方案1】:

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

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

应该是这样的:

Inventory : ObjectId('someId');

这就是它没有填充的原因,因为它在inventoryModel 中找不到ObjectId 作为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 并将某个库存文档的ObjectId 保存在productDetail 文档中,同时保存或更新。

【讨论】:

  • 嗨,Ravi,我已经更新了有关上述问题的数据,这是您需要的吗?
  • 嗨 Ravi 现在终于可以正常工作了!非常感谢你的帮助。 :D
  • 我很高兴,我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 2016-04-28
  • 2023-03-21
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2015-08-26
  • 1970-01-01
相关资源
最近更新 更多