无法填充嵌套数组

Posted

技术标签:

【中文标题】无法填充嵌套数组【英文标题】:Unable to populate nested array 【发布时间】:2018-07-05 05:58:21 【问题描述】:

我对 MongoDB 和 Mongoose 还很陌生,我正在尝试填充嵌套数组,但没有任何运气。

用户有一个名为“proceedings”的道具,它是一个对象数组。该数组中的每个元素都包含一些道具,包括称为“表单”的数组。

proceedings[i].forms 保存表单集合中所有表单的引用以进行诉讼。

除了“表格”之外,“程序”中没有可填充的内容。 我正在尝试为每个进程填充嵌套的“表单”数组。

所以:

User: 
  _id: ObjectId,
  proceedings: [
    
      _id: ObjectId,
      forms: [
        ObjectId,
        ObjectId,
        ObjectId
      ]
    ,
    
      _id: ObjectId,
      forms: [
        ObjectId,
        ObjectId,
        ObjectId
      ]
    
  ]

架构:

const formSchema = new Schema(
  userId: 
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  ,
  values:  type: mongoose.Schema.Types.Mixed 
,  timestamps: true );

const proceedingsSchema = new Schema(
  initial_questions: ,
  forms: [
    
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Form'
    
  ]
);

const userSchema = new Schema(
  email: 
    type: String,
    default: '',
    unique: true
  ,
  password: 
    type: String,
    default: ''
  ,
  sign_up_date: 
    type: Object,
    default: moment(),
    get: parseDate
  ,
  proceedings: [proceedingsSchema]
,  timestamps: true );

userSchema.set('toObject',  getters: true );
userSchema.set('toJSON',  getters: true );

export const User = mongoose.model('Users', userSchema);
export const Form = mongoose.model('Forms', formSchema);

查询:

User.findOne( _id: id )
  .populate(
    path: 'proceedings',
    populate: 
      path: 'forms',
      model: 'Form'
    
  )
  .exec((err, user) => 
    console.log(user.proceedings[0].forms)
  )

结果是一个 ObjectId 的数组,而不是填充的表单。

非常感谢任何帮助。

猫鼬 - v5.0.1

【问题讨论】:

你永远不会定义你的进程模式模型 @dprogramz 感谢您的关注。程序只是用户模式的一个道具。表单被大量写入,所以我将它们移到了他们自己的集合中,而程序实际上只写入了几次,然后将引用添加到另一个表单。 【参考方案1】:

在考虑了更多@dprogramz 评论后,我决定将程序移至他们自己的收藏中。此查询现在有效:

 Proceeding.find( userId: id )
    .populate(
      path: 'forms',
      model: 'Forms'
    )
    .exec((err, proceedings) => 
      if (err) 
        logger.error(err.message);
        return res.send( error: err.message );
      

      if (!proceedings) 
        return res.send( error: 'No such proceedings' );
      

      return res.send( ok:  proceedings, proceedingId: proceedings[proceedings.length - 1]._id );
    );

【讨论】:

以上是关于无法填充嵌套数组的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 动画填充在 Chrome 中无法正常工作

无法查询嵌套的猫鼬数组?

Vuejs 无法推送到嵌套数组

无法填充结构数组

无法使用 plist 填充数组

JS 无法从数组中填充数组