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

各位大佬好:

菜鸟是我,使用微信云开发,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
          })
        }
      )
阅读 2.1k
1 个回答

自己搞定了,使用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
          })
        }
      )
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题