通过对猫鼬的排序属性列出子集合数组的对象

时间:2019-12-16 17:39:11

标签: node.js express mongoose

我想对集合的子集合中的项目进行排序。我可以列出它们,但不能按照我想要的方式列出。我希望它们按项目数组对象的'no'属性进行排序

  

我的收藏模式

const itemSchema = mongoose.Schema({

  item: [{ name: String, no: Number }],

});
module.exports = mongoose.model("Item", itemSchema);

我的端点

getItems(req, res) {
    try {
      Item.find({ _id: req.item._id }, (err, founds) => {
        if (err) {
          res
            .status(httpStatus.INTERNAL_SERVER_ERROR)
            .json({ message: "error occured!", err });
        }

        res.send(founds[0].item);
      });
    } catch (error) {
      res
        .status(httpStatus.INTERNAL_SERVER_ERROR)
        .json({ message: "display item error", error });
    }
  },

1 个答案:

答案 0 :(得分:0)

您可以通过使用聚合来做到这一点。 首先我们是matching个文档,然后是unwindingsorting,最后是grouping

  Item.aggregate([
    {
      $match: {
        _id: mongoose.Types.ObjectId("5df7c5121debf22a388da1c7")
      }
    },
    {
      $unwind: "$item"
    },
    {
      $sort: {
        "item.no": -1  //1 (for ascending) or -1 (for descending)
      }
    },
    {
      $group: {
        _id: "$_id",
        item: {
          $push: "$item"
        }
      }
    }
  ])
    .then(founds => {
      if (founds.length > 0) {
        res.send(founds[0]);
      } else {
        res.status(400).send("No doc found");
      }
    })
    .catch(err => {
      res
        .status(httpStatus.INTERNAL_SERVER_ERROR)
        .json({ message: "error occured!", err });
    });