MongoDB小程序云开发聚合查询如何排序?

作者站长头像
站长
· 阅读数 15

各位大佬好:

菜鸟是我,使用微信云开发,MongoDB聚合查询树状目录数据的时候,嵌套排序碰到了一些问题。

我使用lookup聚合查询后.sort({rank: 1})只能对分类名进行排序,不能对书籍列表进行排序。

希望得到各位大佬的指导,感谢感谢~~

一、需求:

制作一个书籍分类列表,根据分类名对书籍数据进行树状目录展示。

二、当前错误结果:

  • 分类名 rank:3

    • 书名 rank:2
    • 书名 rank:1
    • 书名 rank:3
  • 分类名 rank:2

    • 书名 rank:2
    • 书名 rank:3
    • 书名 rank:1
  • 分类名 rank:1

    • 书名 rank:3
    • 书名 rank:1
    • 书名 rank:2

三、预期正确结果:

  • 分类名 rank:3

    • 书名 rank:3
    • 书名 rank:2
    • 书名 rank:1
  • 分类名 rank:2

    • 书名 rank:3
    • 书名 rank:2
    • 书名 rank:1
  • 分类名 rank:1

    • 书名 rank:3
    • 书名 rank:2
    • 书名 rank:1

四、数据表示例

category - 分类表:

[
    {
        "_id": 1,
        "category": "novel",
        "rank": 1
    },
    {
        "_id": 2,
        "category": "science",
        "rank": 3
    },
    {
        "_id": 3,
        "category": "love",
        "rank": 2
    }
]

book - 书籍表

[
    {
        "_id": "book1",
        "author": "author 1",
        "category": "novel",
        "stock": 10,
        "time": 1564456048486,
        "rank": 6,
        "title": "novel 1"
    },
    {
        "_id": "book3",
        "author": "author 3",
        "category": "science",
        "stock": 30,
        "rank": 13,
        "title": "science 1"
    },
    {
        "_id": "book4",
        "author": "author 3",
        "category": "science",
        "stock": 40,
        "rank": 22,
        "title": "science 2"
    },
    {
        "_id": "book2",
        "author": "author 2",
        "category": "novel",
        "stock": 20,
        "rank": 7,
        "title": "novel 2"
    },
    {
        "_id": "book5",
        "author": "author 4",
        "category": "science",
        "stock": 50,
        "rank": 12,
        "title": null
    },
    {
        "_id": "book6",
        "author": "author 5",
        "category": "novel",
        "rank": 5,
        "stock": "60"
    }
]

五、我的查询代码

db.collection('category')
      .aggregate()
      .sort({
        rank: 1, // 生效
      })
      .lookup({
        from: 'book',
        localField: 'category',
        foreignField: 'category',
        as: 'bookList',
      })
      .sort({
        rank: 1,  // 不生效
      })
      .end()
      .then(
        function (res) {
          console.log(res)
          return resolve({
            code: 20000,
            data: res.data
          })
        }
      )
回复
1个回答
avatar
test
2024-07-18

自己搞定了,使用pipeline子查询方法。

const db = cloud.database()
const _ = db.command;
const $ = db.command.aggregate

db.collection('category')
      .aggregate()
      .sort({
        rank: 1,
      })
      .lookup({
        from: 'book',
        let: {
          category_name: '$category',
        },
        pipeline: $.pipeline()
          .match(_.expr($.eq(['$category', '$$category_name'])))
          .sort({
            rank: 1
          })
          .done(),
        as: 'bookList',
      })
      .end()
      .then(
        function (res) {
          console.log(res)
          return resolve({
            code: 20000,
            data: res.data
          })
        }
      )
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容