什么是对集合中的以下文档进行排序的最佳方式:
{"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,这需要复杂的排序,猫鼬没有。那么这个架构可能没有真正的解决方案吗?
非常感谢您的帮助
答案 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
}
}
])