Javascript mongoose根据文档中的特定值对文档进行排序

Javascript mongoose根据文档中的特定值对文档进行排序,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我使用这种语法来过滤文档 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

我使用这种语法来过滤文档

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} }
]);

看起来内部
if/then/else
s的格式有问题。实际上,您在第三个和第四个
else
中缺少了一些
$cond
操作符。因此,
order
属性(使用
if/then/else
而不是数字的对象)的值不正确

这个版本适合我:

[
  {
    $project: {
      'document': '$$ROOT',
      order: {
        $cond: {
          if: {'$eq': ['$someField', 'D']}, then: 1,
          else: {
            '$cond': {
              'if': {'$eq': ['$someField', 'B']}, then: 2,
              else: {
                '$cond': {
                  'if': {'$eq': ['$someField', 'A']}, then: 3,
                  else: {
                    '$cond': {'if': {'$eq': ['$someField', 'C']}, then: 4, else: 5}
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {$sort: {'order': 1}}
]
然而,在这种情况下,我认为运算符可能更好,特别是如果您有更多可能的值(而不仅仅是这4个值)


看起来内部
if/then/else
s的格式有问题。实际上,您在第三个和第四个
else
中缺少了一些
$cond
操作符。因此,
order
属性(使用
if/then/else
而不是数字的对象)的值不正确

这个版本适合我:

[
  {
    $project: {
      'document': '$$ROOT',
      order: {
        $cond: {
          if: {'$eq': ['$someField', 'D']}, then: 1,
          else: {
            '$cond': {
              'if': {'$eq': ['$someField', 'B']}, then: 2,
              else: {
                '$cond': {
                  'if': {'$eq': ['$someField', 'A']}, then: 3,
                  else: {
                    '$cond': {'if': {'$eq': ['$someField', 'C']}, then: 4, else: 5}
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {$sort: {'order': 1}}
]
然而,在这种情况下,我认为运算符可能更好,特别是如果您有更多可能的值(而不仅仅是这4个值)


我设法用另一种方法修复了它。 当我在DB中插入文档时,我要索引的每个字段都将有另一个字段,该字段将表示值的索引。 (假设字段名为course,其值为A、B、C、D-我将添加名为courseIndex的字段,并通过值-A=4、B=1、C=2、D=3映射索引)


有了这个,我可以根据我的条件实现排序:)

我设法用一种不同的方法修复了它。 当我在DB中插入文档时,我要索引的每个字段都将有另一个字段,该字段将表示值的索引。 (假设字段名为course,其值为A、B、C、D-我将添加名为courseIndex的字段,并通过值-A=4、B=1、C=2、D=3映射索引)



有了它,我可以根据我的条件实现排序:)

你不能在启动前实际排序,你需要用JavaScript代码进行排序。我一开始做了,这对大多数情况都很好,问题是,有时文档数超过1M,服务器崩溃,错误是没有剩余内存堆栈……@KunalMukherjee您确定我不能在执行前排序吗?您可以在发送到DBA之前使用
.sort
在代码中排序(在内存中/阻塞事件循环),还有一个问题,我的限制是每页100个文档(我也使用分页),你不能在启动之前进行排序,你需要用JavaScript代码进行排序。我一开始是这样做的,对大多数情况都很好,问题是,有时文档数超过1M,服务器崩溃,错误是没有剩余内存堆栈……@KunalMukherjee您确定我不能在执行前排序吗?您可以在发送到DBA之前使用
.sort
在代码中排序(在内存中/阻塞事件循环),还有一个问题,我的限制是每页100个文档(我也在使用分页)首先,感谢您的时间,其次-它不起作用(当我执行此聚合时没有发生任何事情)嗯。。。那你能分享更多的细节吗?我在一些生成的数据上运行了它,效果很好。这一步之前可能有问题(你说你以前有一些过滤器)?另外,请确保设置正确的属性名,而不是
$name
(这是我的假数据中的属性)。当然,我将$name更改为我的字段,我之前所做的只是筛选与查询语句匹配的内容(请看我问题的顶部-我解释了我的工作。您能告诉我ot工作时的情况吗?(我的意思是,从exec方法返回的文档按此聚合排序?)是的,文档是按升序排序的。
find
aggregate
这两个词不能很好地结合在一起。与其分别使用
find
aggregate
,不如尝试使用
$match
操作符()。请参见此处了解更多详细信息:问题是过滤器非常动态(如我所说,我有40个过滤器)。我需要找到一种方法,可以动态过滤-然后按我想要的顺序对所有文档进行排序…首先,感谢您的时间,其次-它不起作用(我执行此聚合时不会发生任何事情)嗯……你能分享更多的细节吗?我在一些生成的数据上运行了它,效果很好。这一步之前可能有问题(你说你以前有一些过滤器)?另外,确保设置正确的属性名称,而不是
$name
(这是我伪造数据中的属性)。当然,我将$name更改为我的字段,我之前所做的只是筛选与查询语句匹配的内容(请看问题的顶部-我解释了我所做的事情。您能告诉我ot工作时它的外观吗?(我的意思是,从exec方法返回的文档按此聚合排序?)是的,文档是按升序排序的。
find
aggregate
这两个词不能很好地结合在一起。与其分别使用
find
aggregate
,不如尝试使用
$match
操作符()。有关更多详细信息,请参见此处:问题在于过滤器为v