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

Mongodb 根据项目在另一个集合中被引用的次数对项目进行排序,mongodb,mongoose,mongodb-query,aggregate,Mongodb,Mongoose,Mongodb Query,Aggregate,我有一个项目集合,每个项目都有一个类型(水果、蔬菜等)和一个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([ { $grou

我有一个项目集合,每个项目都有一个类型(水果、蔬菜等)和一个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
            }
        ]
    }
]
这可能会帮助你

  • $lookup
    加入两个集合。我用过
  • $unwind
    解构阵列。因为我们无法对数组进行排序
  • $sort
    按降序排序
  • $group
    通过
    类型
脚本在这里

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" }
    }
  }
])
工作

这可能会帮助你

  • $lookup
    加入两个集合。我用过
  • $unwind
    解构阵列。因为我们无法对数组进行排序
  • $sort
    按降序排序
  • $group
    通过
    类型
脚本在这里

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" }
    }
  }
])
工作