如何访问在 Mongoose 模式对象数组的另一个数组中定义的数组元素?

Posted

技术标签:

【中文标题】如何访问在 Mongoose 模式对象数组的另一个数组中定义的数组元素?【英文标题】:How to access array elements that are defined in another array of Mongoose scheme object Array? 【发布时间】:2020-12-04 16:51:26 【问题描述】:

这是猫鼬中的User 架构:

var userSchema = new mongoose.Schema(
  email: 
    type: String,
    unique: true,
    required: true,
  ,
  name: 
    type: String,
    required: true,
  ,

  Addtasks: [
    
      topic: String,
      words: Number,
      keywords: String,
      website: String,
      otherdetails: String,
      exampleRadios: String,
      deadline: Date,
      Date: String,
      fileName: String,
      Bigpaths: [],
    ,
  ],
);
module.exports = mongoose.model('User', userSchema);

我想使用/访问Bigpaths 数组,该数组在Addtasks 数组中定义,该数组在User 中定义。 mongoDB 中已经有数据,我通过 UI 页面插入了这些数据。我正在尝试以下代码,但在控制台中出现此错误:

data.Addtasks[Object.keys(data.Addtasks).length - 2].Bigpaths.forEach(
  (element) => 
    // ...
    
)

作为

TypeError: Cannot read property 'Bigpaths' of undefined
    at \Desktop\grumpytext\routes\index.js:99:71

代码:

const  files  = req;
User.findOne( email: req.user.email , function (error, data) 
  if (error) 
    console.log('Three');
   else if (data) 
    if (Object.keys(data.Addtasks).length > 1) 
      data.Addtasks[Object.keys(data.Addtasks).length - 2].Bigpaths.forEach(
        (element) => 
          files.forEach((currentElement) => 
            if (element.name == currentElement.filename) 
              files.pull(currentElement.filename);
            
          );
        
      );
    
  
);

如何解决此错误或如何访问Bigpaths 数组的所有元素以便我可以使用forEach 循环对其进行迭代?

【问题讨论】:

【参考方案1】:

我不确定这里,但我认为您需要在操作之前populate Addtasks:

const files = req.files;
User.findOne(email:req.user.email).populate('Addtasks').exec((error, data) => 
    if (error) 
        console.log("Three");
      
    else 
    
        if(data)
        
            if(Object.keys(data.Addtasks).length > 1)
            
                console.log("Addtasks count: " + Object.keys(data.Addtasks).length);
                data.Addtasks[Object.keys(data.Addtasks).length - 2].Bigpaths.forEach(element => 
                    files.forEach(currentElement => 
                    if(element.name == currentElement.filename)
                    
                        files.pull(currentElement.filename);
                    
                    )
            );
            
        
    
);

请注意日志console.log("Addtasks count: " + Object.keys(data.Addtasks).length); - 如果解决方案不起作用,我建议添加一些打印,尤其是检查元素数量是否符合预期或对象内的属性是否正常。

【讨论】:

Addtasks 的数量是多少?

以上是关于如何访问在 Mongoose 模式对象数组的另一个数组中定义的数组元素?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose- 将数组中的数据搜索/过滤到具有特定项目的另一个数组中

如何在不选择模式配置参数的情况下使用 mongoose 在 MongoDB 模式实例化中的关联数组/对象中执行 foreach?

Mongoose 模式:如何设置数组中的最大项目数?

更新对象数组中的元素在 Mongoose 中不起作用

嵌套对象的模式/解析 graphql/mongoose

Mongoose - 如何从数组元素中删除对象[重复]