Mongoose 按标签聚合分组项目

Posted

技术标签:

【中文标题】Mongoose 按标签聚合分组项目【英文标题】:Mongoose aggregate group items by tag 【发布时间】:2020-08-27 23:44:44 【问题描述】:

我正在尝试按标签对项目进行分组。但我不明白我到底想做什么。

有带有标签的架构项目(_idnametags)是tags_id 的数组(从标签架构中引用)

Item = new Schema(
    id: Schema.ObjectId,
    name: String,
    tags: [  type: Schema.ObjectId, ref: 'Tag' ]
);

Tag = new Schema(
    id: Schema.ObjectId,
    name: String
);

这是我到目前为止所做的:

Item.aggregate([
        
          "$lookup": 
            "from": Tag.collection.name,
            "let":  "tags": "$tags" ,
            "pipeline": [
              
                "$match": 
                  "$expr":  "$in": ['$_id', '$$tags'] 
                
              ,
              
                "$project": 
                  "_id": 1,
                  "name": 1
                
              
            ],
            "as": 'tags'
          
        ,
        
          "$group": 
            "_id": "$tags._id",
            "items": 
              "$push": 
                "id": "$_id",
                "name": "$name",
              
            
          
        
      ]);

这就是我得到的


  "data": [
    
      "_id": [
        "5eb95e8dcae79713f1de0a27"
      ],
      "items": [
        
          "id": "5eb95e9fcae79713f1de0a28",
          "name": "My Item 1"
        
      ]
    ,
    
      "_id": [
        "5eb9564dc4317411fe79e1bf"
      ],
      "items": [
        
          "id": "5eb95b1430f138131ed90f4f",
          "name": "My Item 2"
        ,
        
          "id": "5eb95ed0cae79713f1de0a29",
          "name": "My Item 3"
        
      ]
    
  ]

我想获取每个标签的name,而不仅仅是_id,可能不在数组中。在我希望收到的结果下方:


  "data": [
    
      "_id": "5eb95e8dcae79713f1de0a27",
      "name": "My Tag name 1",
      "items": [
        
          "id": "5eb95e9fcae79713f1de0a28",
          "name": "My Item 1"
        
      ]
    ,
    
      "_id": "5eb9564dc4317411fe79e1bf",
      "name": "My Tag name 2",
      "items": [
        
          "id": "5eb95b1430f138131ed90f4f",
          "name": "My Item 2"
        ,
        
          "id": "5eb95ed0cae79713f1de0a29",
          "name": "My Item 3"
        
      ]
    
  ]

我做错了什么?

【问题讨论】:

【参考方案1】:

解决此问题的一种方法是将标签-name 添加到您的$group 运算符:

...

    "$group": 
        "_id": "$tags._id",
        "tagName": $first: "$tags.name",
        "items": 
            "$push": 
                "id": "$_id",
                "name": "$name",
            
        
    

...

请注意,这将获取每个组的第一个匹配条目。另一种选择是使用$replaceRoot$mergeObjects 运算符,就像使用here 一样。

【讨论】:

@Anthony Lee:我的查询中有一个小错误,现在应该修复了。

以上是关于Mongoose 按标签聚合分组项目的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬聚合框架中按日期排序

Mongoose 聚合查找 - 如何按特定 id 过滤

如何在 Promscale 的聚合查询中对标签进行分组

Mongoose $lookup 聚合没有按预期工作

Mongoose 聚合不按输入日期过滤

Mongoose 聚合不按输入日期过滤