【问题标题】: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
            }
        ]
    }
]

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregate


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 2019-05-20
      相关资源
      最近更新 更多