我在具有此架构的 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
查找查询中的数组,具有第二低的优先级 $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/