Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongoose/mongodb自定义排序_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js mongoose/mongodb自定义排序

Node.js mongoose/mongodb自定义排序,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我在MongoDB中有一个字符串类型的字段。它将包含一些字母和数字的组合,如“10”、“101”、“11”、“112”、“x115”、“abc.5”。现在,如果我告诉MongoDB对这些进行排序,它将按字母顺序排序,顺序如下: 十, 101 十一, 112 abc.5 x115 如果在“11”之前排序为“101”,如何更改排序以使数字正确排序?如果您决定在数据库端执行此操作,则可能需要使用 我认为这不可能直接实现;这个 当然没有提到任何提供自定义比较的方法 功能 你最好在客户机中进行分类,

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

  • 十,
  • 101
  • 十一,
  • 112
  • abc.5
  • x115

如果在“11”之前排序为“101”,如何更改排序以使数字正确排序?

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

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

你最好在客户机中进行分类,但是如果你 真的决定在你可能使用的服务器上做这件事吗
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 
});
与等效的客户端排序相比:

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

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

db.collectionName.find().sort({fieldToSortOnName:-1}).排序规则({locale:“en_US”,numericOrdering:true})


此处locale:“en_us”用于进行不区分大小写的搜索或排序

鉴于eval会阻止所有读写操作,
eval
不是一个好的生产系统选项。以下是针对它的完整警告集:。总结是除非在特殊情况下,否则不要使用它。我在我的帖子中链接到了这一点,其中大多数都围绕着不被禁用的独占锁。dit阻止所有JavaScript&不能在分片系统中使用。这可能是个问题。您可以使用
db.runCommand()
禁用该锁定行为,而不是使用帮助程序,如果eval执行严格的只读操作,则可以通过将
nolock
标志设置为
true
来禁用锁定。这是一个严格的只读操作。当存储为字符串时,您需要对数字进行零填充以使其排序一致(然后在需要时删除零)。