gpt4 book ai didi

javascript - 在 MongoDB 中按字母顺序对文档进行排序(也称为自然排序顺序,人类排序)

转载 作者:IT老高 更新时间:2023-10-28 13:08:42 24 4
gpt4 key购买 nike

我想了解如何使用 MongoDB 进行此操作

我有名称为“file1”、“file2”、“file22”、“file11”的文档(名称可以是任何名称,没有特定的模式)我运行查询以获取按名称排序的所有文档,结果与预期不符。

> db.mydata.find().sort({"name":1});                                                                                                                          
{ "_id" : ObjectId("571e5a787e88d30b20b7857c"), "name" : "file1" }
{ "_id" : ObjectId("571e5a8c7e88d30b20b7857d"), "name" : "file11" }
{ "_id" : ObjectId("571e5a977e88d30b20b7857f"), "name" : "file2" }
{ "_id" : ObjectId("571e5a937e88d30b20b7857e"), "name" : "file22" }

预期的是(字母/自然顺序)

{ "_id" : ObjectId("571e5a787e88d30b20b7857c"), "name" : "file1" }                                                                                            
{ "_id" : ObjectId("571e5a977e88d30b20b7857f"), "name" : "file2" }
{ "_id" : ObjectId("571e5a8c7e88d30b20b7857d"), "name" : "file11" }
{ "_id" : ObjectId("571e5a937e88d30b20b7857e"), "name" : "file22" }

根据我的发现,还有其他排序方法,例如使用 aggregate + $project$meta: "textScore",但是到目前为止我还没有成功。

更新:这个问题的一个应用:按名称对文件夹/文件进行排序 Windows Explorer, Folders sorted by Name

最佳答案

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" }

关于javascript - 在 MongoDB 中按字母顺序对文档进行排序(也称为自然排序顺序,人类排序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36849039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com