【发布时间】:2021-09-19 05:15:01
【问题描述】:
我在具有此架构的 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 可以是NEW 或USED,isLive 可以是true 或false,searchPriority 将是一个介于 1 到 3 之间的整数。(较小的数字意味着它应该在搜索结果)
这里,除了_id,其他字段都不是唯一的。我在isLive、vehicleDetails.city 和searchPriority 上创建了一个复合索引。
在我的应用程序中,我将执行一些这种形式的查询:
- 查找
isLive为true、vehicleDetails.city为的所有汽车Delhi或New Delhi或Gurugram和vehicleCondition是USED(或NEW)。
为此,我可以像这样进行查找查询:
db.collection.find({"isLive": true, "vehicleDetails.city": { $in: [ "Gurugram", "Delhi", "New Delhi" ] }, "vehicleCondition": "USED" }, {})
我希望此查询的结果按此顺序排序:
- 在查找查询中属于
$in数组中第一个城市的所有汽车,优先级最低 - 在查找查询中属于
$in数组中第一个城市的所有汽车,优先级第二低 - 所有属于
$inarrarray 内第一个城市的汽车 查询,具有第三低优先级 - 在查找查询中属于
$in数组中第二个城市的所有汽车,优先级最低 - 在查找查询中属于
$in数组中第二个城市的所有汽车,优先级第二低 - 在查找查询中属于
$in数组内的第二个城市的所有汽车,具有第三低优先级 查找查询中属于$in数组中第三个城市的所有汽车,优先级最低 - 在查找查询中属于
$in数组中第三个城市的所有汽车,优先级第二低 - 在查找查询中属于
$in数组中的第三个城市的所有汽车,具有第三低优先级
我该怎么做?由于此查询返回的文档数量可能非常大,因此我将使用分页来限制返回的文档数量。这个额外的要求会对这个问题的可能解决方案有任何影响吗?
【问题讨论】:
-
不幸的是,您不能轻松地执行自定义排序顺序。您可以使用 MongoDB 聚合操作您的文档以执行自定义顺序,但 MongoDB 在这种情况下不能使用索引。最好的解决方案是:存储预煮订单并使用它进行排序。
-
@Valijon 你能解释一下“存储预煮订单并将其用于分类”是什么意思吗?
-
我的意思是,
inside $in arrray的顺序无关紧要,您可以定义顺序静态方式:Gurugram始终是最低的 (10X),然后是Delhi(20X),等等...检查一下:mongoplayground.net/p/8zTHzlLYiqD -
@Valijon 感谢您的回答,但不幸的是,静态优先级对我不起作用,因为
$in数组会因上下文而异。例如:在某些情况下也可以是 ["New Delhi", "Gurugram", "Delhi"],在这种情况下,我希望 "New Delhi" 的结果排在首位。我在 SQL 数据库方面的经验为 0,您认为在 SQL 中可以实现这样的事情吗? -
不。您提供的订单仅用于搜索
标签: mongodb mongoose aggregation-framework