Node.js 使用嵌套对象填充嵌套Mongoose对象

Node.js 使用嵌套对象填充嵌套Mongoose对象,node.js,mongodb,mongoose,mongoose-schema,mongoose-populate,Node.js,Mongodb,Mongoose,Mongoose Schema,Mongoose Populate,我正在做我的第一个项目,这几天来我一直在为这个项目苦苦挣扎 我试图填充一个对象,该对象包含啤酒厂信息和啤酒模型中对应的单个啤酒 models.js var mongoose = require('mongoose'), Schema = mongoose.Schema; var beerSchema = Schema({ breweryName: String, beer: [{ beerName: String }] }); var draf

我正在做我的第一个项目,这几天来我一直在为这个项目苦苦挣扎

我试图填充一个对象,该对象包含啤酒厂信息和啤酒模型中对应的单个啤酒

models.js

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

var beerSchema = Schema({
    breweryName: String,
    beer: [{
        beerName: String
    }]
});

var draftlistSchema = Schema ({
    userName: String,
    tap: [{
        tapNo: Number,
        _tapBeer: { type: Schema.Types.ObjectId, ref: 'Beer' },
        tapStatus: String
    }]
});

var Draftlist = mongoose.model('Draftlist', draftlistSchema);
var Beer = mongoose.model('Beer', beerSchema);

module.exports = {
    Draftlist: Draftlist,
    Beer: Beer
    }
route.js

var getDraftlist = function(user, callback) {
  models.Draftlist.findOne({ 'userName': user }).populate( {
    path: 'tap._tapBeer',
    model: 'Draftlist'
    }).exec(function(err, draftlist) {
    // console.log(draftlist.tap)
    console.log(draftlist);
    callback(draftlist);      
  });
};`
我得到一个空值,返回当前代码。理想情况下,我希望返回的对象看起来像--

带空返回的Draftlist对象

{ _id: 590bd0615a190204fca6d467,
  userName: 'A New User1',
  __v: 1,
  tap: 
   [ { tapNo: 1,
       _tapBeer: null,
       tapStatus: 'onTap',
       _id: 590bd0615a190204fca6d46d },
     { tapNo: 2,
       _tapBeer: null,
       tapStatus: 'onTap',
       _id: 590bd0615a190204fca6d46c },
     { tapNo: 3,
       _tapBeer: null,
       tapStatus: 'onTap',
       _id: 590bd0615a190204fca6d46b },
     { tapNo: null,
       _tapBeer: null,
       tapStatus: 'Cellar',
       _id: 590bd0615a190204fca6d46a },
     { tapNo: null,
       _tapBeer: null,
       tapStatus: 'Cellar',
       _id: 590bd0615a190204fca6d469 },
     { tapNo: null,
       _tapBeer: null,
       tapStatus: 'Cellar',
       _id: 590bd0615a190204fca6d468 },
     { _tapBeer: null,
       tapStatus: 'Cellar',
       _id: 590bd0735a190204fca6d470 } ] }
啤酒瓶

{ breweryName: 'Beachwood',
  _id: 590bd3f1ed13510514405cba,
  beer: [ { beerName: 'IPA', _id: 590bd3f1ed13510514405cbb } ] }
使用

用法:

const getDraftlist = (userName, callback) => {
  models
    .Draftlist
      .findOne({
       userName
      })
      .deepPopulate('tap._tapBeer')
      .exec((err, draftlist) => {
        console.log(draftlist);
        callback(draftlist);      
      });
};
或:

使用

用法:

const getDraftlist = (userName, callback) => {
  models
    .Draftlist
      .findOne({
       userName
      })
      .deepPopulate('tap._tapBeer')
      .exec((err, draftlist) => {
        console.log(draftlist);
        callback(draftlist);      
      });
};
或:


你试过了吗
populate({path:'tap.\u tapBeer',model:'Beer'})
或只是
.populate('tap.\u tapBeer')
@Veeram仔细阅读,他已经在使用它了(:@num8er他引用了错误的模型。我的错误,好像是在我的位置上深夜了(:尝试添加
mongoose.set('debug',true)
在文件顶部,检查控制台上的查询,你能从两个集合中添加一个示例文档吗?你试过了吗?
填充({path:'tap.'tapBeer',model:'Beer})
或只是
填充('tap.'tapBeer')
@Veeram仔细阅读,他已经在使用它了(:@num8er他引用了错误的模型。我的错误,似乎是深夜在我的位置(:尝试添加
mongoose.set('debug',true));
在文件顶部,检查控制台上的查询,您可以添加两个集合中的示例文档吗?谢谢,但这仍然返回空值。我想这是因为我引用了嵌套在BeerSchema中的beer对象的ID。有什么想法吗?您确定集合中有引用nces正确吗?@BHalvy82在我的回答中也尝试了另一个示例尝试了另一个示例,但仍然不走运。我肯定ObjectId匹配。谢谢,但这仍然返回空值。我想这是因为我引用了嵌套在BeerSchema中的beer对象的ID。有什么想法吗?你确定你的收藏中有文档吗“那引用的是正确的吗?@BHalvy82在我的回答中也尝试了另一个例子尝试了另一个例子,但仍然不走运。我确信ObjectId匹配。
const getDraftlist = (userName, callback) => {
  models
    .Draftlist
      .findOne({
       userName
      })
      .deepPopulate('tap._tapBeer')
      .exec((err, draftlist) => {
        console.log(draftlist);
        callback(draftlist);      
      });
};
const Draftlist = models.Draftlist;
const getDraftlist = (userName, callback) => {
  Draftlist
    .findOne({
     userName
    })
    .exec((err, draftlist) => {
      Draftlist
        .deepPopulate(
          draftlist, 'tap._tapBeer', 
          (err, draflist) => {
            console.log(draftlist);
            callback(draftlist);  
          });
    });
};