【发布时间】:2020-08-10 02:16:03
【问题描述】:
我正在使用这种语法来过滤文档
const query = Model.find();
const filters = req.body;
if(filters.someValue){
query.find().where('someValue').eq(filters.someValie);
}
...(imagine 40 more)
在执行此查询以查找所有文档之前,我想按我将确定的特定顺序对其进行排序
if(filters.sort){
here the sort need to be applied - before execution.
}
我在数据库中获得了一些具有四个可选值的字段,并且我想将顺序附加到每个值(需要应用排序)。 假设值可以是:
"A", "B", "C", "D"
我希望文档排序的顺序:
{value:"A",order:3}, {value:"B", order:2}, {value:"C", order:4}, {value:"D", order:1}
并在应用排序后 - 执行查询。 问题是我在网上找不到任何关于此的内容,而我唯一尝试过的(与排序和条件聚合) - 没有奏效。 代码:
SomeModel.aggregate([
{ "$project" : {
"document": "$$ROOT",
"order" : {
"$cond" : {
if : { "$eq" : ["$someField", "D"] }, then : 1,
else : { "$cond" : {
"if" : { "$eq" : ["$someField", "B"] }, then : 2,
else : { "if" : { "$eq" : ["$someField", "A"]}, then: 3,
else : { "if" : { "$eq" : ["$someField", "C"]}, then: 4
}
}
}
}
}
}
}},
{"$sort" : {"order" : 1} }
]);
【问题讨论】:
-
在触发之前实际上无法排序,需要在 JavaScript 代码中进行
-
我一开始就这样做了,它对大多数情况都很好,问题是有时文档数量超过 1M 并且服务器崩溃并出现没有内存堆栈的错误.. ..
-
@KunalMukherjee 你确定我不能在执行前排序吗?
-
您可以在发送到数据库之前使用
.sort对代码(在内存中/阻塞事件循环)进行排序 -
还有一个问题,我的每页限制为 100 个文档(我也在使用分页)
标签: javascript node.js mongodb mongoose