MongoDB 自定义排序顺序,用于带分页的查询

标签 mongodb mongoose aggregation-framework

我在具有此架构的 MongoDB 集合中有一些文档:

{
    "_id": {
        "$oid": "60c1e8e318afd80016ce58b1"
    },
    "searchPriority": 1,
    "isLive": false,
    "vehicleCondition": "USED",
    "vehicleDetails": {
        "city": "Delhi"
    }
},
{
    "_id": {
        "$oid": "60c1f2f418afd80016ce58b5"
    },
    "searchPriority": 2,
    "isLive": false,
    "vehicleCondition": "USED",
    "vehicleDetails": {
        "city": "Delhi"
    }
},
{
    "_id": {
        "$oid": "60cb429eadd33c00139d2be7"
    },
    "searchPriority": 1,
    "isLive": false,
    "vehicleCondition": "USED",
    "vehicleDetails": {
        "city": "Gurugram"
    }
},
{
    "_id": {
        "$oid": "60c21be618afd80016ce5905"
    },
    "searchPriority": 2,
    "isLive": false,
    "vehicleCondition": "USED",
    "vehicleDetails": {
        "city": "New Delhi"
    }
},
{
    "_id": {
        "$oid": "60e306d29e452d00134b978f"
    },
    "searchPriority": 3,
    "isLive": false,
    "vehicleCondition": "USED",
    "vehicleDetails": {
        "city": "New Delhi"
    }
}
vehicleCondition可以 NEWUSED , isLive可以 truefalsesearchPriority将是 1 到 3 之间的整数。(数字越小意味着它在搜索结果中应该越高)
在这里,除了 _id其他字段都不是唯一的。我在 isLive 上创建了一个复合索引, vehicleDetails.citysearchPriority .
在我的应用程序中,我将执行一些这种形式的查询:
  • 查找所有汽车所在的位置 isLivetrue , vehicleDetails.city
    要么 DelhiNew DelhiGurugramvehicleConditionUSED (或 NEW)。

  • 为此,我可以执行这样的查找查询:
    db.collection.find({"isLive": true, "vehicleDetails.city": { $in: [ "Gurugram", "Delhi", "New Delhi" ] }, "vehicleCondition": "USED" }, {})
    
    我希望此查询的结果按以下顺序排序:
  • 所有属于第一个城市内的汽车$in查找查询中的数组,具有最低优先级
  • 所有属于第一个城市内的汽车$in查找查询中的数组,具有第二低的优先级
  • 所有属于第一个城市内的汽车$in数组中的查找
    查询,具有第三低优先级
  • 属于内第二个城市的所有汽车$in查找查询中的数组,具有最低优先级
  • 属于内第二个城市的所有汽车$in查找查询中的数组,具有第二低的优先级
  • 属于内第二个城市的所有汽车$in查找查询中的数组,具有第三低的优先级
    内所有属于第三个城市的汽车$in查找查询中的数组,具有最低优先级
  • 内所有属于第三个城市的汽车$in查找查询中的数组,具有第二低的优先级
  • 内所有属于第三个城市的汽车$in查找查询中的数组,具有第三低的优先级

  • 我怎样才能做到这一点?由于此查询返回的文档数量可能非常大,因此我将使用分页来限制返回文档的数量。这个额外的要求对这个问题的可能解决方案有什么影响吗?

    最佳答案

    您可以在匹配后添加自定义排序顺序字段,以根据输入的城市条件顺序和搜索优先顺序对字段进行排序。由于是计算字段索引不会用于排序。
    您可以在末尾添加分页,就像对任何其他查询一样。
    就像是

    db.collection.aggregate([
      {
        $match: {
          "isLive": true,
          "vehicleDetails.city": {
            $in: [
              "Gurugram",
              "Delhi",
              "New Delhi"
            ]
          },
          "vehicleCondition": "USED"
        }
      },
      {
        "$addFields": {
          "cityIndex": {
            "$indexOfArray": [
              [
                "Gurugram",
                "Delhi",
                "New Delhi"
              ],
              "$vehicleDetails.city"
            ]
          }
        }
      },
      {
        $sort: {
          cityIndex: 1,
          sortPriority: 1
        }
      },
      {
        $project: {
          cityIndex: 0
        }
      }
    ])
    
    可以在此处找到工作示例 - https://mongoplayground.net/p/16-YOkPotLX

    关于MongoDB 自定义排序顺序,用于带分页的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68306685/

    相关文章:

    mongodb - 在聚合中使用带限制和跳过的排序时出现 Mongodb 重复问题

    python - 从 mongoDB 中提取信息

    javascript - 删除mongodb中的数组元素

    mongodb - 我可以使用 golang (mgo) 在一个查询中聚合两个 mongodb 查询吗?

    javascript - 将上下文添加到 Mongoose 回调

    node.js - 对文档调用精益会抛出 TypeError : lean is not a function

    javascript - 将对象数组投影到键值

    mongodb - meteor - Mongo写入错误

    node.js - 无法通过Docker-compose连接到MongoDB

    mongodb - 使用 mongodb-1.2.2 和 Rocket-0.5.0-rc.1 时如何解决异步不兼容问题?