如何使用-number后缀对字符串进行MongoDB查询排序?

fun*_*eah 11 javascript mongodb

我有一个问题:

ownUnnamedPages = Entries.find( { author : this.userId, title : {$regex: /^unnamed-/ }}, {sort: { title: 1 }}).fetch()
Run Code Online (Sandbox Code Playgroud)

返回以下数组排序:

[ { 
    title: 'unnamed-1',
    text: '<p>sdaasdasdasd</p>',
    tags: [],
    _id: 'Wkxxpapm8bbiq59ig',
    author: 'AHSwfYgeGmur9oHzu',
    visibility: 'public' },
{ 
    title: 'unnamed-10',
    text: '',
    author: 'AHSwfYgeGmur9oHzu',
    visibility: 'public',
    _id: 'aDSN2XFjQPh9HPu4c' },
{ 
    title: 'unnamed-2',
    text: '<p>kkhjk</p>',
    tags: [],
    _id: 'iM9FMCsyzehQvYGKj',
    author: 'AHSwfYgeGmur9oHzu',
    visibility: 'public' },
{ 
    title: 'unnamed-3',
    text: '',
    tags: [],
    _id: 'zK2w9MEQGnwsm3Cqh',
    author: 'AHSwfYgeGmur9oHzu',
    visibility: 'public' }]
Run Code Online (Sandbox Code Playgroud)

问题是,它似乎排序第一个数字字符,所以它认为正确的序列是1,10,2,3等....我真正想要的是它对整个数字部分进行排序,以便10将结束.

我不希望通过为数字添加01或001等附加数字来实现此目的.

我该怎么办?

Leo*_*opd 16

MongoDB无法按存储为字符串的数字进行排序.您必须将数字作为整数存储在其自己的字段中,使用前导零填充,或者在从数据库返回结果后对结果进行排序.

  • 我希望mongodb可以对存储为字符串的数字进行排序:( (6认同)
  • db.collectionName.find().sort({title:1}).collat​​ion({locale:"en_US",numericOrdering:true}) (4认同)
  • 嘿@Leopd,你的回答似乎不再正确了。正如 @Eugene 正确指出的那样,这可以使用“collat​​ion”并传递“numbericOrdering”参数来完成。我通常会否决这样一个误导性的答案,但它在评论中包含正确的答案:) (2认同)

MrE*_*MrE 5

如果您填写数字,您将能够以正确的顺序搜索为字符串,因此而不是0,1,2,3,4,5,6,7,8,9,10,11 ...使用01,02,03,04,05,06,07,08,09,10,11 ...并且字符串搜索将按顺序返回它们.

  • 显然,您需要填充足够的 0 以覆盖您将使用的整个积分器范围,因为如果您仅将零填充到 2 位数字,则 100 仍然会在 20 之前出现。01, 02...,10...100, 20 需要填充为 001, 002, 003,... 010, ... 020, ..., 100... (2认同)

Eug*_*rov 5

您可以使用

db.collectionName.find().sort({title: 1}).collation({locale: "en_US", numericOrdering: true})
Run Code Online (Sandbox Code Playgroud)

numericOrdering标志是布尔值,并且是可选的。用于确定将数字字符串比较为数字还是字符串的标志。如果为true,则比较为数字;否则为0。即“ 10”大于“ 2”。如果为false,则比较为字符串;否则为false。即“ 10”小于“ 2”。默认为false。


Mas*_*rzi 5

mongo 文档说你可以使用排序规则来实现这个目标,正如 @Eugene Kaurov 所说你可以使用

.collation({locale: "en_US", numericOrdering: true})
Run Code Online (Sandbox Code Playgroud)

这是官方文档: mongo ref

并注意现在接受的答案不正确