【问题标题】:mongoose/mongodb custom sortmongoose/mongodb 自定义排序
【发布时间】:2013-02-06 02:12:33
【问题描述】:

我在 MongoDB 中有一个字符串类型的字段。它将包含一些字母和数字的组合,例如“10”、“101”、“11”、“112”、“x115”、“abc.5”。现在,如果我告诉 MongoDB 对这些进行排序,它将按字母顺序排序,如下所示:

  • 10
  • 101
  • 11
  • 112
  • abc.5
  • x115

它在“11”之前排序“101”,我该如何更改排序以便正确排序数字?

【问题讨论】:

  • 当存储为字符串时,您需要对数字进行零填充以使它们排序一致(如果需要,稍后再删除零)。

标签: node.js mongodb mongoose


【解决方案1】:

如果您决定在数据库端执行此操作,您可能需要使用 db.eval

Answer extracted from another question:

我不认为这是直接可能的; sort documentation 当然没有提到任何提供自定义比较的方法 功能。

您可能最好在客户端中进行排序,但如果您是 真的下定决心在你能用的服务器上做 db.eval() 安排在服务器上运行排序(如果您的客户端 支持)。

服务器端排序:

db.eval(function() { 
  return db.scratch.find().toArray().sort(function(doc1, doc2) { 
    return doc1.a - doc2.a 
  }) 
});

相对于等效的客户端排序:

db.scratch.find().toArray().sort(function(doc1, doc2) { 
  return doc1.a - doc2.b 
});

【讨论】:

  • 鉴于 eval 会阻止所有读取和写入,eval 不是一个好的生产系统选项。
  • 这里是它的完整警告集:docs.mongodb.org/manual/reference/method/db.eval。总结是除非在特殊情况下,否则不要使用它。
  • 我在帖子中链接到了,其中大部分都围绕着排他锁不被禁用
  • 它会阻止所有 JavaScript 并且不能在分片系统中使用。这可能是个问题。
  • 可以使用 db.runCommand() 而不是助手来禁用该锁定行为,您可以通过将 nolock 标志设置为true 如果 eval 执行严格的只读操作。而这严格的只读操作。
【解决方案2】:

您可以将排序规则与 numericOrdering 参数一起使用。 示例:

db.collectionName.find().sort({fieldToSortOnName: -1}).collation({locale: "en_US", numericOrdering: true})

此处语言环境:“en_us”用于进行不区分大小写的搜索或排序。

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多