【问题标题】:Populate a Nested Mongoose Object w/ a Nested Object使用嵌套对象填充嵌套 Mongoose 对象
【发布时间】:2017-10-03 07:46:01
【问题描述】:

从事我的第一个项目,并为此困扰了几天。

我正在尝试填充一个对象,该对象包含啤酒厂信息和来自 Beer 模型的单个对应啤酒。

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);      
  });
};`

当前代码返回了一个空值。理想情况下,我希望返回的对象看起来像--

{
breweryName: Some Brewery,
beer: {// Beer object that was referenced by Id //}
}

具有空返回的草稿列表对象

{ _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 } ] }

【问题讨论】:

  • 你试过了吗? populate( { path: 'tap._tapBeer', model: 'Beer' } ) 或只是 .populate('tap._tapBeer')
  • @Veeram 仔细阅读,他已经在使用它了(:
  • @num8er 他引用了错误的模型。
  • 我的错,我这里好像是深夜了(:
  • 尝试在文件顶部添加mongoose.set('debug', true); 并检查控制台上的查询,您可以从两个集合中添加示例文档吗?

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


【解决方案1】:

使用mongoose-deep-populate

const
 mongoose = require('mongoose'),
 deepPopulate = require('mongoose-deep-populate')(mongoose);
 Schema = mongoose.Schema;

const 
  BeerSchema = Schema({
    breweryName: Schema.Types.String,
    beer: [{
      beerName: Schema.Types.String
    }]
  }),
  DraftlistSchema = Schema ({
    userName: Schema.Types.String,
    tap: [{
        tapNo: Schema.Types.Number,
        _tapBeer: {
          type: Schema.Types.ObjectId, 
          ref: 'Beer' 
        },
        tapStatus: Schema.Types.String
    }]
  });

DraftlistSchema.plugin(deepPopulate);

var Draftlist = mongoose.model('Draftlist', DraftlistSchema);
var Beer = mongoose.model('Beer', BeerSchema);

module.exports = {Draftlist, Beer};

用法:

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);  
          });
    });
};

【讨论】:

  • 谢谢,但这仍然返回一个空值。我认为这是因为我引用了嵌套在 BeerSchema 中的啤酒对象的 ID。有什么想法吗?
  • 您确定您的收藏中有正确引用的文档吗?
  • @BHalvy82 也在我的回答中尝试另一个例子
  • 尝试了另一个示例,但仍然没有运气。我很肯定 ObjectId 匹配。
猜你喜欢
  • 2019-09-23
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多