具有对象元素的嵌套数组模式返回具有空对象的数组

Posted

技术标签:

【中文标题】具有对象元素的嵌套数组模式返回具有空对象的数组【英文标题】:A nested array schema with object element returns an array with empty object 【发布时间】:2020-01-24 08:58:32 【问题描述】:

我想要对象数组,即 teamMembers 应该是一个数组,并且应该将对象作为具有属性名称和角色的元素。我没有收到任何错误,当我 console.log(req.body) 时,它在我想要的格式,但是作为对象的数组元素不会发布到架构中。

  _id: mongoose.Schema.Types.ObjectId,
  teamName:  type: String, unique: true ,
  teamMembers: 
    name: 
      type: String, unique: true, lowercase: true, required: true
    ,
    role: 
      type: String,
      enum: ['goal keeper', 'central back', 'central midfield', 'central forward', 'left wing',
        'attacking midfield', 'central forward', 'left midfielder', 'striker', 'defending', 'right midfielder'],
      required: true
    ,
    type: Array
  ,
  description: String,
  createdAt:  type: Date, default: Date.now() ,
  updatedAt:  type: Date, default: Date.now() 
);

teamSchema.plugin(uniqueValidator); ```


I am not getting the desired result. Here is my collection from mogodb


"_id":"$oid":"5d89d5da3f33f36579bfed25",
"teamMembers":[],
"createdAt":"$date":"$numberLong":"1569314251247",
"updatedAt":"$date":"$numberLong":"1569314251247",
"teamName":"Arsenal",
"__v":"$numberInt":"0"

Expected result
``` "teamMembers":["name": "bernd leno", "role": "goal keeper"] ```

Gotten result ``` "teamMembers":[] ```

Here is my below

```static async addTeam(req, res) 
    const 
      teamName, teamMembers, description
     = req.body;
    try 
      if (!req.user.isAdmin) 
        return response(res, 404, 'error', 
          message: messages.unAuthorizedRoute
        );
      
      const teams = new TeamModel(
        _id: new mongoose.Types.ObjectId(),
        teamName,
        teamMembers,
        description
      );
      const team = await teams.save();
      if (team) 
        return response(res, 201, 'success',  team );
      
     catch (error) 
      (error.errors.teamName.name === 'ValidatorError')
        ? response(res, 409, 'error', 
          message: messages.duplicateName
        )
        : response(res, 400, 'error', 
          message: messages.error
        );
    
  ```


【问题讨论】:

teamMembers: name, role , - 那是 not 数组,基本上我在您的代码中没有看到添加预期数组内容的有效尝试。此外,该属性上的 array 对象的架构不正确。应该改为 teamMembers: [ name: String, role: ..all of your stuff.. ] 并且 that 是具有这两个已定义属性的对象数组的定义。 另外非常重要是您不希望在数组成员上设置唯一性。这实际上意味着集合的唯一索引,而不是像您想象的那样意味着数组中的唯一。 MongoDB 中的数组 uniqueness 不是由索引强制执行的。这只会导致问题,因为您很可能希望该属性出现在集合的多个文档中,即使您希望它在单个文档的数组中唯一 请在您的问题上使用edit 获取更多详细信息或更正。评论不是这些的地方。 我贴的teamModel是正确的,因为我将type指示为Array,teamMembers: name: type: String, unique: true, lowercase: true, required: true , role: type: String, enum: ['goal keeper', 'central back', 'central midfield', 'central forward', 'left wing', 'attacking midfield', 'central forward', 'left midfielder', 'striker', 'defending', 'right midfielder'], required: true , type: Array //type is an array... This is scalable 经过多次console.log,我意识到name和role参数未定义 我现在面临的问题是如何从邮递员发布数组对象。这对我不起作用,因为 req.body.name 和 req.body.role 将是未定义的"teamMembers": ["name": "bernd leno", "role":"goal keeper"] 【参考方案1】:

我的代码是正确的,我没有从邮递员正确发布对象数组。Right way to post an array of objects in postman using urlencoded

它也适用于原始 json/urlencoded


    "teamName": "Arsenal",
    "teamMembers": ["name": "bernd leno", "role":"goal keeper", "name": "Emiliano Martinez", "role":"goal keeper"]

【讨论】:

以上是关于具有对象元素的嵌套数组模式返回具有空对象的数组的主要内容,如果未能解决你的问题,请参考以下文章

具有空对象模式的 DAO

遍历具有深层嵌套对象和数组的对象数组

如何将树状的数组和对象的嵌套数据结构转换为具有计算/计数 id 和跟踪父 id 的项目列表?

如何从具有嵌套对象数组的对象数组中获取所有特定值?

Mongoose 查询返回带有空数组的嵌套文档

Linq 查询以返回具有特定属性值的嵌套数组