【问题标题】:Mongoose populate works with exec() but not with cursor()Mongoose 填充适用于 exec() 但不适用于 cursor()
【发布时间】:2017-02-01 19:30:09
【问题描述】:

以下工作正常:

Campaign.find({
   ...
})
  .populate('summary')
  .lean(true)
  .exec()
  .then(function (data) {
    console.log(data)
  })

但是,如果我尝试对光标做同样的事情:

var cursor = Campaign.find({
   ...
})
  .populate('summary')
  .lean(true)
  .exec
  .cursor()

cursor.next().then(function (data) {
  console.log(data)
})

summary 字段未填充,仅返回模型引用的 ObjectId

编辑

以下是我的架构的相关部分:

var ObjectId = mongoose.Schema.Types.ObjectId
var campaignSchema = mongoose.Schema({
  // ...
  summary: { type: ObjectId, ref: 'summaries' },
  // ...
}

var summarySchema = mongoose.Schema({
  // ...
}

var Campaign = mongoose.model('Campaign', campaignSchema, 'campaigns')
var Summary = mongoose.model('Summary', summarySchema, 'summaries')

这是设计使然吗?还是我错过了什么?

编辑#2

如果值得的话,我正在使用 Mongo 3.0.12 和 Mongoose 4.4.20。

【问题讨论】:

  • 你也可以显示你的架构吗?
  • 你去...

标签: node.js mongodb mongoose mongoose-populate


【解决方案1】:

您应该使用Schema.Types.ObjectId 而不是ObjectId 并且参考值应该是Summary 而不是summaries 那么它应该可以工作。

var campaignSchema = mongoose.Schema({
  // ...
  summary: { type: Schema.Types.ObjectId, ref: 'Summary' },
  // ...
}

var summarySchema = mongoose.Schema({
  // ...
}

var Campaign = mongoose.model('Campaign', campaignSchema)
var Summary = mongoose.model('Summary', summarySchema)

对于cursor,无需使用.exec

var cursor = Campaign.find({
   ...
})
  .populate('summary')
  .lean(true)
  .cursor();

cursor.next(function(error, doc) {
  console.log(doc);
});

【讨论】:

  • 对不起,ObjectIdSchema.Types.ObjectId 的别名...我忘了包括它。此外,为什么当我使用exec 时它可以工作,但不能使用cursor
  • 在使用ref: "summaries"而不是Summary时正确填充?
  • 示例中也缺少此内容...我已经编辑了问题...抱歉造成混淆...这是一个巨大的架构,我只需要提取相关部分。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多