猫鼬:排序

时间:2016-08-14 09:02:48

标签: javascript mongoose

什么是对集合中的以下文档进行排序的最佳方式:

{"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,这需要复杂的排序,猫鼬没有。那么这个架构可能没有真正的解决方案吗?

非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

我建议您将for k in k_range: clf = KNeighborsClassifier(n_neighbors = k) clf.fit(X_train,y_train) y_pred = clf.predict(X_test) scores.append(metrics.accuracy_score(y_test,y_pred)) 归档为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

答案 1 :(得分: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