簡體   English   中英

如何使用 -number 后綴對字符串進行 MongoDB 查詢排序?

[英]How to make a MongoDB query sort on strings with -number postfix?

我有一個疑問:

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)來做到這一點。

我該怎么做?

您可以使用

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

numericOrdering 標志是布爾值並且是可選的。 確定是將數字字符串作為數字還是作為字符串進行比較的標志。 如果為真,則作為數字進行比較; 即“10”大於“2”。 如果為假,則作為字符串進行比較; 即“10”小於“2”。 默認為假。

MongoDB 無法按存儲為字符串的數字進行排序。 您必須將數字作為整數存儲在其自己的字段中,用前導零填充,或者在從數據庫返回結果后對結果進行排序。

如果您 0 填充數字,您將能夠以正確的順序作為字符串進行搜索,而不是 0,1,2,3,4,5,6,7,8,9,10,11... 使用01,02,03,04,05,06,07,08,09,10,11... 字符串搜索將按順序返回它們。

mongo 文檔說你可以使用 Collat​​ion 來實現這個目標,因為@Eugene Kaurov 說你可以使用

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

這是官方文檔: mongo ref

並注意現在接受的答案不正確

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

就我而言,我們使用聚合。 方法是使用字符串的長度進行排序; 僅當文本部分始終相同時才有效(在您的情況下未命名)

db.YourCollection.aggregate([
  {
    $addFields: {
      "TitleSize": { $strLenCP: "$Title" }
    }
  },
  {
    $sort: {
      "TitleIdSize": 1,
      "Title": 1
    }
  }
]);

現在我們使用長度進行排序,第二次排序將使用內容。

例子:

  • "unnamed-2", Titlesize: 9
  • "unnamed-7", Titlesize: 9
  • "unnamed-30", Titlesize: 10
  • "unnamed-1", Titlesize: 9

第一種排序將按照以下順序放置 id: 2 , 7 , 1 , 30 然后第二次排序會將 ids 以正確的順序排列: 1 , 2 , 7 , 30

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM