Node.js mongoose/mongodb自定义排序
我在MongoDB中有一个字符串类型的字段。它将包含一些字母和数字的组合,如“10”、“101”、“11”、“112”、“x115”、“abc.5”。现在,如果我告诉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”,如何更改排序以使数字正确排序?如果您决定在数据库端执行此操作,则可能需要使用 我认为这不可能直接实现;这个 当然没有提到任何提供自定义比较的方法 功能 你最好在客户机中进行分类,
- 十,
- 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
来禁用锁定。这是一个严格的只读操作。当存储为字符串时,您需要对数字进行零填充以使其排序一致(然后在需要时删除零)。