需要在 Mongoose 中获取按外键分组的记录列表

Posted

技术标签:

【中文标题】需要在 Mongoose 中获取按外键分组的记录列表【英文标题】:Need to get list of records grouped by foreign key in Mongoose 【发布时间】:2020-01-02 18:20:38 【问题描述】:

我有 2 个表interestTypes 和interests 表,兴趣记录存储了interestTypeId 引用。

现在我需要兴趣类型列表及其兴趣。

const interestSchema = new mongoose.Schema(
  
    name: 
      type: String,
      trim: true,
      minlength: 3,
      maxlength: 50,
      required: true
    ,
    interestTypes: [
      
        interestTypeId: 
          type: mongoose.SchemaTypes.ObjectId,
          ref: 'interestType'
        
      
    ]
  ,
  
    timestamps: true
  
)

const interestTypeSchema = new mongoose.Schema(
  
    name: 
      type: String,
      trim: true,
      minlength: 3,
      maxlength: 50,
      required: true
    
  ,
  
    timestamps: true
  
)

我知道这可以通过查找聚合来完成,但我搞砸了。这段代码是用兴趣模型写的

interestSchema.statics.getTypes = function() 
    return new Promise((resolve, reject) => 

    this.aggregate([
      
        "$lookup":
          
            "from": "interestTypes",
            "localField": "interestType",
            "as": "interestTypes",
            "foreignField": "_id",
          
      ,
      
        "$group": 
          
            "_id": "$_id",
            "interestTypes":  "$push": "$interestTypes" 
          
        
    ],
      function(err, result) 
        if (err) return reject(err)        
        resolve(result)
      
    )

无法得到想要的结果

我希望这个方法返回的是这样的

[

    id: interestTypeIdRef1,
    name: interestType1
    interests: [
    
        id: interestIdRef1,
        name: interestType1
    ,
    
        id: interestIdRef2,
        name: interestType2
    ,
    
        id: interestIdRef3,
        name: interestType3
    
    ]
,

    id: interestTypeIdRef2,
    name: interestType1
    interests: [
    
        id: interestIdRef2,
        name: interestType1
    ,
    
        id: interestIdRef3,
        name: interestType2
    ,
    
        id: interestIdRef4,
        name: interestType3
    
    ]

]

【问题讨论】:

【参考方案1】:

从interestTypeSchema 开始聚合以获得所需的输出。

InterestSchema.statics.getTypes = function () 
return new Promise((resolve, reject) => 

    interestType.aggregate([
        
            $lookup: 
                from: 'interestSchema',
                localField: '_id',
                foreignField: 'interestTypeId',
                as: 'interests'
            
        ,
        
            $project: 
                name:1,
                interests:1,
            
        
    ],
        function (err, result) 
            if (err) return reject(err)
            resolve(result)
        
    )

【讨论】:

它仍然没有给我兴趣数组。 [ id:interestTypeIdRef1,名称:interestType1 , id:interestTypeIdRef2,名称:interestType1 ] 谢谢@vishal 但现在它给出了空列表 [ id: interestTypeIdRef1, name: interestType1,interests: [] , id: interestTypeIdRef2, name: interestType1,interests: [] ] 【参考方案2】:

您可以使用下面的链接来检查查询。 这是在聚合中进行查找的查询

已创建示例数据库

db=
  "interestTypes": [
    
      "typeId": 1,
      "type": "type1"
    ,
    
      "typeId": 2,
      "type": "type2"
    
  ],
  "interests": [
    
      "_id": 1,
      "interestName": "interest1",
      "interestTypeId": 1
    ,
    
      "_id": 2,
      "interestName": "interest2",
      "interestTypeId": 1
    ,
    
      "_id": 3,
      "interestName": "interest3",
      "interestTypeId": 2
    ,
    
      "_id": 4,
      "interestName": "interest4",
      "interestTypeId": 2
    ,
    
      "_id": 5,
      "interestName": "interest5",
      "interestTypeId": 1
    
  ]

示例答案

db.interestTypes.aggregate([
  
    $lookup: 
      from: "interests",
      localField: "typeId",
      foreignField: "interestTypeId",
      as: "interesetTypesWithInterest"
    
  ,
  
    $project: 
      type: 1,
      interestTypeId: "$typeId",
      interests: "$interesetTypesWithInterest"
    
  
])

使用此链接进行验证 https://mongoplayground.net/p/3f5AzKQMamw 既然您熟悉将 mongodb 代码转换为 Mongoose,它将对您有所帮助。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 同意你的建议。 @MihaiChelaru 这不应该意味着你不赞成答案。我已经编辑了我的答案。 我不是对您的答案投反对票的人。我只是在审查队列中遇到它并采取了适当的措施。不要以为我投了反对票,因为自动生成的评论来自我。 不用担心,@MihaiChelaru 感谢您的建议。这将有助于我将来发布更多解释性答案。

以上是关于需要在 Mongoose 中获取按外键分组的记录列表的主要内容,如果未能解决你的问题,请参考以下文章

使用linq在mvc5中按外键表分组表

如何在 BigQuery 中按外键分组?

按外键/相关字段分组 django 查询集

在 admin 中按外键 id 搜索

Django模型按外键过滤

Laravel 关系多对多按外键计数相关数据