的MongoDB不提供一種方式來做到這一點開箱即用,但你仍然有兩種選擇:
首先是使用Array.prototype.sort
方法對數組結果進行排序的客戶端處理。
db.mydata.find().toArray().sort((a, b) => {
var x = Number(a.name.match(/\d+/g)[0]);
var y = Number(b.name.match(/\d+/g)[0]);
return x === y ? 0 :(x < y ? -1 : 1);
})
第二這是我建議你做的是你的正常化有額外的域,按住數字在「名稱」爲整數,並使用該值你的文檔進行排序文件。這意味着,您需要更新文檔以添加該字段,並且最好的方法是使用$set
更新運算符和"bulk operations"以獲得最大效率。也就是說,從MongoDB服務器版本3.2開始,您需要使用collection.bulkWrite
方法來完成此操作。
var requests = [];
db.mydata.find({}, { "name": 1 }).forEach(doc => {
var fileId = Number(doc.name.match(/\d+/g)[0]); // return number from "name" value
requests.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "fileId": fileId } }
}
});
// Execute per 1000 operations and re-init the requests queue
if(requests.length === 1000)
db.mydata.bulkWrite(requests);
})
// Clean up queues
if (requests.length > 0)
db.mydata.bulkWrite(requests);
從MongoDB的服務器版本2.6您需要使用現在已經過時Bulk
API。
var bulk = db.mydata.initializeUnorderedBulkOp();
var count = 0;
db.collection.find({}, { "name": 1 }).forEach(function(doc) {
var fileId = Number(doc.name.match(/\d+/g)[0]);
bulk.find({"_id": doc._id}).updateOne({
"$set": { "fileId": fileId }
});
count++;
if (count % 1000 === 0) {
bulk.execute();
bulk = db.mydata.initializeUnorderedBulkOp();
}
})
if (count > 0)
bulk.execute();
從MongoDB的服務器版本2.4起,你需要不同的方法。
db.collection.find({}, { "name": 1 }).forEach(function(doc) {
var fileId = Number(doc.name.match(/\d+/g)[0]);
db.collection.update(
{ "_id": doc._id },
{"$set": { "fileId": fileId } }
);
})
之後的任何這種操作的,您的文檔現在看起來是這樣的:
{ "_id" : ObjectId("571e5a787e88d30b20b7857c"), "name" : "file1", "fileId" : 1 }
{ "_id" : ObjectId("571e5a8c7e88d30b20b7857d"), "name" : "file11", "fileId" : 11 }
{ "_id" : ObjectId("571e5a977e88d30b20b7857f"), "name" : "file2", "fileId" : 2 }
{ "_id" : ObjectId("571e5a937e88d30b20b7857e"), "name" : "file22", "fileId" : 22 }
現在,您可以輕鬆地排序使用.sort
方法您的文檔。
db.mydata.find({}, { "name": 1 }).sort({ "fileId": 1 })
產生以下結果:
{ "_id" : ObjectId("571e5a787e88d30b20b7857c"), "name" : "file1" }
{ "_id" : ObjectId("571e5a977e88d30b20b7857f"), "name" : "file2" }
{ "_id" : ObjectId("571e5a8c7e88d30b20b7857d"), "name" : "file11" }
{ "_id" : ObjectId("571e5a937e88d30b20b7857e"), "name" : "file22" }
不個個都'在他們file'共同?? – kryshna
不,@ kryshna,這是一組簡化的數據。 – 6220119
我不知道如何將file1