在 Mongoose 中使用“Ref”获取 mongo 数据时出现问题

Posted

技术标签:

【中文标题】在 Mongoose 中使用“Ref”获取 mongo 数据时出现问题【英文标题】:Issue while fetching mongo data with "Ref" in Mongoose 【发布时间】:2019-12-31 00:29:50 【问题描述】:

嘿,我一直在尝试 graphql,所以有一种情况我被困在“Ref”部分......假设我有太多如下定义的模式

用户.js

const userschema = new Schema(
  email: 
    type: String,
    required: true
  ,
  createdevents: [
    
      type: Schema.Types.ObjectId,
      ref: "Event"
    
  ]
);
module.exports = mongoose.model("User", userschema);

然后是 events.js

const eventschema=new Schema(
    title:
        type:String,
        required:true
    ,
    price:
        type:Number,
        required:true
    ,
    creator:
        type:Schema.Types.ObjectId,
        ref:'User'
    
)
module.exports=mongoose.model('Event',eventschema)

所以当我处理事件数据时,我尝试通过以下 populate() 方法获取用户属性

events: () => 
        return Event.find().populate('creator').then(result => 
          return result.map(e => 
            return  ...e._doc, _id: e._doc._id.toString() ;
          );
        );
      

所以我现在可以访问所有用户属性,但是如果我需要访问 User.js 中“createdevents”内的事件字段怎么办,这意味着我需要再次运行填充方法,以便我可以获得所有事件属性存储在“createdevents”中,但代码相同

简而言之,我需要在此处再应用一种填充方法

 events: () => 
                return Event.find().populate('creator').then(result => 
                  return result.map(e => 
                    return  ...e._doc, _id: e._doc._id.toString() ;
                  );
                );
              

这样我就可以在 createdevents 内的所有事件属性中再访问一次

我需要的顺序是这样的

事件(创建者)->使用填充(实现所有用户属性)->现在在 User.js 中我必须再次应用填充以实现所有事件属性

对不起,如果这听起来很奇怪,我无法解释 我认为它类似于多级人口

现在如果我运行查询

query
  events
    title
    creator
      _id
      email
      createdevents
        _id
      
    
  

我明白了


  "data": 
    "events": [
      
        "title": "asd",
        "creator": 
          "_id": "5d64354bfd7bb826a9331948",
          "email": "test@test.com",
          "createdevents": [
            
              "_id": "5d6435a78150062703df70ff"
            ,
            
              "_id": "5d6435ab8150062703df7101"
            ,
            
              "_id": "5d6435cc8150062703df7102"
            
          ]
        
      
    ]
  

这很好,但我只能获取事件的 _ids 我需要获取所有可以通过填充方法实现的属性我猜

【问题讨论】:

【参考方案1】:

您可以通过以下方式跨多个级别填充:

Event.find()
     .populate(
       path: 'creator',
       populate:  path: 'createdevents' 
     );

【讨论】:

感谢它的工作!你能看看***.com/questions/57665932/…这实际上是同样的问题

以上是关于在 Mongoose 中使用“Ref”获取 mongo 数据时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose.js:强制总是填充

如何在 mongodb 和 mongoose 模型中使用 cloudinary

Nodejs Mongoose 获取属性值的结果数组

在 Mongoose 中填充包含 ref 的数组数组

如何在 Mongoose 中搜索填充数组 [包含 ref 的数组]

Mongoose:引用另一个模型时使用 ref 类型或 [model schema] 有啥区别?