根据项目在另一个集合中被引用的次数对项目进行排序

Posted

技术标签:

【中文标题】根据项目在另一个集合中被引用的次数对项目进行排序【英文标题】:Sort items depending on how much times they are referenced in another collection 【发布时间】:2021-04-15 16:20:38 【问题描述】:

我有一个项目集合,每个项目都有一个类型(水果、蔬菜等)和一个 ID:

type: 'Fruit',
_id: '0'

type: 'Vegetable',
_id: '1'

type: 'Fruit',
_id: '2'

然后我有一个购买集合,每个购买引用一个项目:

item_id: '2'

item_id: '1'

item_id: '0'

item_id: '2'

现在我可以使用以下代码获得最畅销的商品:

buySchema.aggregate([
     $group:  _id: "$item_id", numFills:  $sum: 1   ,
     $sort:  numFills: -1  
]).limit(10).exec(function (err, top) 
    if (err) return res.status(400).send('error');
    return res.status(200).send(top);
);

此代码输出以下 json:

[
  
    "_id": "2",
    "numFills": 2
  ,
  
    "_id": "0",
    "numFills": 1
  ,
  
    "_id": "1",
    "numFills": 1
  
]

我现在想要的是每种类型的***列表(一个用于水果,另一个用于蔬菜等),如下所示:

[
    
        "type": "Fruits",
        "items": [
            
                "_id": "2",
                "numFills": 2
            ,
            
                "_id": "0",
                "numFills": 1
            
        ]
    ,
    
        "type": "Vegetables",
        items: [
            
                "_id": "1",
                "numFills": 1
            
        ]
    
]

【问题讨论】:

【参考方案1】:

这可能对你有帮助,

$lookup 加入两个收藏。我用过uncorelated lookup $unwind 解构数组。因为我们无法对数组进行排序 $sort 降序排序 $group 通过type 重构数组

脚本在这里

db.items.aggregate([
  
    "$lookup": 
      "from": "buys",
      "let":  iId: "$_id" ,
      "pipeline": [
        
          $match: 
            $expr:  $eq: [ "$item_id", "$$iId" ] 
          
        ,
        
          $group: 
            _id: "$item_id",
            numFills:  $sum: 1 
          
        
      ],
      "as": "joinBuys"
    
  ,
   "$unwind": "$joinBuys" ,
  
    $sort:  "joinBuys.numFills": -1 
  ,
  
    $group: 
      _id: "$type",
      items:  $push: "$joinBuys" 
    
  
])

工作Mongo playground

【讨论】:

以上是关于根据项目在另一个集合中被引用的次数对项目进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何根据3个项目对Dart集合进行排序?

Flutter:根据类型对 ListView 项进行排序

项目:文件的压缩与解压

根据元素的频率对数组进行排序

Azure DevOps对查询结果中的工作项进行重新排序

nsfetchedresultscontroller 根据项目计数对部分进行排序