如何对 mongoose/mongodb 和 nodejs 中的对象数组进行排序?

Posted

技术标签:

【中文标题】如何对 mongoose/mongodb 和 nodejs 中的对象数组进行排序?【英文标题】:How to sort array of object in mongoose/mongodb and nodejs? 【发布时间】:2021-10-02 21:17:02 【问题描述】:

我想找到一个品牌,然后根据价格按升序和降序对与该品牌关联的产品进行排序。我试过了,但它没有改变任何东西。是否可以使用猫鼬或我必须添加的其他代码?

控制器


exports.getBrandLowtoHighPrice = (req, res, next) => 

    const page = +req.query.page || 1; //convert to number
    let totalItems;
  
    let sessionUser = req.user;
    if (typeof sessionUser == "undefined") 
      sessionUser = "guest";
    
    Brand.findById(req.params.id)
      .sort('product.createdAt' : -1)
      .skip((page - 1) * ITEM_PER_PAGE) 
      .limit(ITEM_PER_PAGE)
      .populate(
        path: "product",
        populate: 
          path: "category",
          model: "Category",
        ,
        populate: 
          path: "subCategory",
          model: "SubCategory",
        ,
        populate: 
          path: "brand",
          model: "Brand",
        ,
        populate: 
          path: "rating",
          model: "Rating",
        ,
      )
      .then((products) => 
        console.log(products)
        res.render("user/single-brand", 
          categories: req.categories,
          subCategories: req.subCategories,
          bestSeller: req.bestSeller,
          products: products.product,
          brand: req.brand,
          user: sessionUser,
          banner: req.banner,
          brandId: req.params.id,
          currentPage: page,
          hasNextPage: ITEM_PER_PAGE * page < totalItems,
          hasPreviousPage: page > 1,
          nextPage: page + 1,
          previousPage: page - 1,
          lastPage: Math.ceil(totalItems / ITEM_PER_PAGE),
          
        );
      )
      .catch((err) => 
        console.log(err);
      )
  

在这里我尝试了排序但没有工作。我的数据结构看起来像这样 数据


   product:[
     
      category: [Array],
      subCategory: [Array],
      brand: [Array],
      rating: [],
      sellCount: '1',
      color: [Array],
      size: [Array],
      image: [Array],
      _id: 60f444ace8568b2fec481dcf,
      title: 'nvhjm m',
      description: 'hello',
      price: 200,
      discount: 2,
      quantity: 9,
      feature: false,
      active: true,
      stock: true,
      createdAt: 2021-07-18T15:11:40.047Z,
      updatedAt: 2021-07-20T01:23:06.113Z,
      __v: 0
    
  ],
  _id: 60e14e4a94e27f3a2c93a26f,
  brand: 'Acer',
  image: 'images\\2021-07-04T05-59-38.028Z-download.png',
  createdAt: 2021-07-04T05:59:38.042Z,
  updatedAt: 2021-07-18T15:11:40.056Z,
  __v: 0


我想根据产品价格对我的价值进行排序。 谢谢!

【问题讨论】:

这能回答你的问题吗? How to sort array inside collection record in MongoDB? 【参考方案1】:

这可能对你有帮助:

const Brand =  require('../../model/admin/brand')

exports.getBrandLowtoHighPrice = (req, res, next) => 

    const page = +req.query.page || 1; //convert to number
    let totalItems;
  
    let sessionUser = req.user;
    if (typeof sessionUser == "undefined") 
      sessionUser = "guest";
    
    Brand.findById(req.params.id)
      .sort('product.createdAt' : -1)
      .skip((page - 1) * ITEM_PER_PAGE) 
      .limit(ITEM_PER_PAGE)
      .populate(
        path: "product",
        populate: 
          path: "category",
          model: "Category",
        ,
        populate: 
          path: "subCategory",
          model: "SubCategory",
        ,
        populate: 
          path: "brand",
          model: "Brand",
        ,
        populate: 
          path: "rating",
          model: "Rating",
        ,
        options:  sort:  'price': 1  
      )
      /* .populate(path: 'housingposts', options:  sort:  'date': -1   ) */
      .then((products) => 
        console.log(products)
        res.render("user/single-brand", 
          categories: req.categories,
          subCategories: req.subCategories,
          bestSeller: req.bestSeller,
          products: products.product,
          brand: req.brand,
          user: sessionUser,
          banner: req.banner,
          brandId: req.params.id,
          currentPage: page,
          hasNextPage: ITEM_PER_PAGE * page < totalItems,
          hasPreviousPage: page > 1,
          nextPage: page + 1,
          previousPage: page - 1,
          lastPage: Math.ceil(totalItems / ITEM_PER_PAGE),
          
        );
      )
      .catch((err) => 
        console.log(err);
      )
  

【讨论】:

【参考方案2】:

查看 $expr,它使您能够将两个字段值一起比较。 或检查数组 mql 运算符,它可能会有所帮助。

【讨论】:

以上是关于如何对 mongoose/mongodb 和 nodejs 中的对象数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

创建 Mongoose/MongoDB 常量文档

如何在 Mongoose(MongoDB 包装器)中删除一行 [重复]

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

详解node+mongoose+mongoDb(mongoDb安装运行,在node中链接)

如何找到field1大于field2的文档? (Nodejs/Mongoose/MongoDB)