填充嵌套数组的无引用对象

Posted

技术标签:

【中文标题】填充嵌套数组的无引用对象【英文标题】:Populate none ref objects of a nested array 【发布时间】:2020-08-30 20:20:52 【问题描述】:

我正在做一个使用以下项目的项目:

    "@nestjs/core": "^7.0.0",
    "@nestjs/mongoose": "^7.0.0",
    "mongoose": "^5.9.12",
    // ...
    "typescript": "^3.7.4",

使用 mongoose/mongoDB 配置:

      uri: MONGO_DB_URI,
      useUnifiedTopology: true,
      useNewUrlParser: true,
      useFindAndModify: false,
      useCreateIndex: true,

我正在尝试为此模型构建一个简单的 CRUD

export const ContactSchema = new mongoose.Schema(
  
    source_id:  type: String, required: true ,
    firstName:  type: String, trim: true ,
    lastName:  type: String, trim: true ,
    phones: [
      
        number: 
          type: String,
          required: true,
          unique: true,
          validate: 
            validator: function(value) 
              const phoneNumber = parsePhoneNumberFromString(value)
              return phoneNumber && phoneNumber.isValid()
            ,
          ,
        ,
        type: 
          type: String,
          default: function() 
            return parsePhoneNumberFromString(this.number).getType() || "N/A"
          ,
        ,
        code: 
          type: Number,
          default: function() 
            return parsePhoneNumberFromString(this.number).countryCallingCode || undefined
          ,
        ,
        national: 
          type: Number,
          default: function() 
            return parsePhoneNumberFromString(this.number).nationalNumber || undefined
          ,
        ,
      ,
    ],
    email:  type: String, unique: true, required: true, lowercase: true, trim: true ,
  ,
   timestamps: true ,
)

ContactSchema.plugin(mongoosePaginate)

像每个 CRUD 应用程序一样,我愿意让 fildAll()fildOne() 路由返回给定 Contact 的正文 他的所有信息,包括其电话号码列表 .所以我用了:

  // ...
  async findAll(): Promise<Contact[]> 
    return this.contactModel.find()
    // then I add
    .populate('phones')
  

  async findBySourceId(id: string): Promise<Contact> 
    return this.contactModel.findOne( source_id: id )
    // then I add
    .populate('phones')
  
  // ...

所有信息都很好地保存在数据库中,并且没有丢失数据(两部手机),而且我确信它甚至可以在不添加 .poplate('x') 的情况下工作,但它在某处发生了变化,它现在返回未填充电话阵列

现在它返回了:

    
        "_id": "5ebc22072e18637d84bcf6f0",
        "firstName": "Maher",
        "lastName": "Boubakri",
        "phones": [],
        "email": "mhb@test.im",
        // ...
    

但是,它应该返回:

    
        "_id": "5ebc22072e18637d84bcf6f0",
        "firstName": "Maher",
        "lastName": "Boubakri",
        "phones": [
            
                "_id": "5ebc22072e18637d8fd948f9",
                "number": "+21622123456",
                "code": 216,
                "type": "MOBILE",
                "national": 22123456,
            
        ],
        "email": "mhb@test.im",
        // ...
    

注意:很明显,MongoDB 会为每个 phone 对象生成_id,但它不是 ref 对象。

任何想法都会很有帮助,

谢谢。

【问题讨论】:

【参考方案1】:

populate 用于使用引用连接两个(或更多)集合

这里你没有任何引用,所以你不需要它

只使用find() 而不使用populate

【讨论】:

正如我所说,当我得到空数组时,我刚刚添加了.populate()!那么,您认为可能是什么问题? 你能发布如何调用这些函数findAll和findSource吗?还要检查手机数组是否存在于数据库中 phones 对象存在于数据库中,正如我之前所说,所有数据都保存得很好,我调用函数的方式也没有问题! 尝试在.find()this.contactModel.find().lean()之后添加.lean() 在更新mongoose 后添加.lean() 解决了这个问题。只需更新您的答案,提及并告诉我更多有关.lean() 功能的信息,以便我接受它✅。谢谢@Mohammed。【参考方案2】:

根据@Mohammed 的评论和回答,更新mongoose 后添加.lean() 解决了问题。

// ...
  async findAll(): Promise<Contact[]> 
    return this.contactModel.find().lean()
  

  async findBySourceId(id: string): Promise<Contact> 
    return this.contactModel.findOne( source_id: id ).lean()
  
// ...

【讨论】:

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

Mongoose 填充包含 ref 的对象数组

Mongoose 填充包含 ref 的对象数组

如何仅在猫鼬中使用聚合填充嵌套在对象数组中的字段?

MongoDB:如何使用查找查询填充嵌套对象?

无法填充嵌套数组

如何在子文档中填充模型实例数组? MongoDB猫鼬