2016-08-14 258 views
1

什麼是一個集合中的下列文件進行排序的最佳方式:貓鼬:排序

{"topic":"11.Topic","text":"a.Text"} 
{"topic":"2.Topic","text":"a.Text"} 
{"topic":"1.Topic","text":"a.Text"} 

我使用以下

find.(topic:req.body.topic).(sort({topic:1})) 

,但不工作(因爲字段是字符串,而不是數字,所以我得到的):

{"topic":"1.Topic","text":"a.Text"}, 
{"topic":"11.Topic","text":"a.Text"}, 
{"topic":"2.Topic","text":"a.Text"} 

,但我想獲得:

{"topic":"1.Topic","text":"a.Text"}, 
{"topic":"2.Topic","text":"a.Text"}, 
{"topic":"11.Topic","text":"a.Text"} 

我讀了另一篇文章here,這將需要貓鼬不具備的複雜排序。那麼這個架構可能沒有真正的解決方案?

你的幫助是極大的讚賞

+1

它的工作很大。你的主題是字符串,正按照這種方式排序。 – yarons

+0

'.sort('topic')' –

+0

這不起作用,因爲正如我在我的問題中所述,主題被排序爲字符串,所以我得到1,11,2 ... – qts

回答

0

我會建議你讓你的topic申請作爲type : Number,並創建另一個領域topic_text

您的架構看起來像:

var documentSchema = new mongoose.Schema({ 

    topic : Number, 
    topic_text : String, 
    text : String 

}); 

普通文件將是這個樣子:

{document1:[{"topic":11,"topic_text" : "Topic" ,"text":"a.Text"}, 
     {"topic":2,"topic_text" : "Topic","text":"a.Text"}, 
     {"topic":1,"topic_text" : "Topic","text":"a.Text"}]} 

因此,你將能夠使用.sort({topic : 1}),並得到你想要的結果。 ,同時使用topic值,將topic_text附加到它。

find(topic:req.body.topic).sort({topic:1}).exec(function(err,result) 
{ 
    var topic = result[0].topic + result[0].topic_text;//use index i to extract the value from result array. 
}) 
+0

你的意思是創建另一個字段,如下所示:{「topic_number」:1,「topic」:「Topic」,「text」:「a.Text」}?我可以做到這一點,但想知道是否有一個不那麼繁瑣的方式 – qts

+0

我的意思是隻保留主題字段作爲數字1,2,..當您使用主題值創建另一個變量,附加主題編號和「.Topic」。 –

+0

請檢查我編輯的答案 –

0

如果你不想(或者甚至不能夠)更改文件的形狀,以包括話題數量,那麼你可以達到你想要的與聚合框架排序數字字段。
下面的流水線基本上將'11.Topic'這樣的主題字符串拆分爲點'。'。然後將結果數組的第一部分前綴爲固定數量的前導零,以便按這些字符串排序將導致「模擬」數字排序。
但請注意,此管道使用$split$strLenBytes運算符,它們非常新,因此您可能需要更新mongoDB實例 - 我使用的是3.3.10版。

db.getCollection('yourCollection').aggregate([ 
    { 
     $project: { 
      topic: 1, 
      text: 1, 
      tmp: { 
       $let: { 
        vars: { 
         numStr: { $arrayElemAt: [{ $split: ["$topic", "."] }, 0] } 
        }, 
        in: { 
         topicNumStr: "$$numStr", 
         topicNumStrLen: { $strLenBytes: "$$numStr" } 
        } 
       } 
      } 
     } 
    }, 
    { 
     $project: { 
      topic: 1, 
      text: 1, 
      topicNumber: { $substr: [{ $concat: ["_0000", "$tmp.topicNumStr"] }, "$tmp.topicNumStrLen", 5] }, 
     } 
    }, 
    { 
     $sort: { topicNumber: 1 } 
    }, 
    { 
     $project: { 
      topic: 1, 
      text: 1 
     } 
    }  
]) 

Working pipeline