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

时间:2013-04-20 23:46:31

标签: javascript mongodb

我有一个问题:

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

返回以下数组:

[ { 
    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' }]

问题是它似乎对第一个数字字符进行排序,因此它认为正确的顺序是1,10,2,3等等.... 我真正想要的是它对整个数字部分进行排序,以便最终得到10个。

我不希望通过为数字添加额外的数字(如01或001)来实现此目的。

我该怎么做?

6 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:5)

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

答案 2 :(得分:5)

您可以使用

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

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

答案 3 :(得分:0)

在mongo中是不可能的(在ascii中对字符串进行排序),但是在从集合中获取所有文档之后,可以使用以下函数进行排序

const sortString = (a, b) => {
  const AA = a.title.split('-');
  const BB = b.title.split('-');

  if (parseInt(AA[1], 10) === parseInt(BB[1], 10)) {
    return 0;
  }
  return (parseInt(AA[1], 10) < parseInt(BB[1], 10)) ? -1 : 1;
};

document.sort(sortString);

答案 4 :(得分:0)

就我而言,我们使用聚合。方法是使用字符串的长度进行排序。仅当文本部分始终相同(在您的情况下为未命名)时才有效

export class DrawerItemDirective {

    constructor(public @Inject(FilterDrawerComponent) drawer) {}

    ngAfterViewInit() {
        const prop = this.drawer.propertyIWantToAccess;
        this.doStuff(prop);
    }
}

现在我们使用长度排序,第二种将使用内容。

示例:

  • “ unnamed-2”,标题大小:9
  • “ unnamed-7”,标题大小:9
  • “ unnamed-30”,标题大小:10
  • “ unnamed-1”,标题大小:9

第一种排序方式将ID依次排列: 2 7 1 30 。然后,第二种排序将以正确的顺序排列ID: 1 2 7 30 。< / p>

答案 5 :(得分:0)

mongo文档说您可以使用归类来实现此目标 正如@Eugene Kaurov所说的,您可以使用

.collation({locale: "en_US", numericOrdering: true})

这是官方文档: mongo ref

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