我有一个 tasks 集合,其中每个任务都有唯一的优先级。我想从Mongo中检索这些任务,这样任何过滤后的子集都会有相对优先级0到 number_of_filtered_objects -1。
当我按任何可排序字段对筛选的任务(需要新的DB调用)进行排序时,任务的相对优先级不应更改(假设DB内容未更改)。
我的灵魂,如下面的Go代码所示,使用$ sort,$ group和$ unwind阶段将序数字段注入每个文档。
这有点不合适,所以我想知道是否有更好的方法。
err = collection.Pipe(
[]bson.M{
{"$match": filter},
// Start of stages to inject ordinal
{"$sort": bson.M{"priority": 1}},
{
"$group": bson.M{
"_id": 0,
"document": bson.M{"$push": "$$ROOT"},
},
},
{
"$unwind": bson.M{
"path": "$document",
"includeArrayIndex": "relative_priority",
},
},
// Ordinal has now been injected
{
"$group": bson.M{
"_id": "$document._id",
"title": bson.M{"$first": "$document.title"},
"priority": bson.M{"$first": "$document.priority"},
"relative_priority": bson.M{"$first": "$relative_priority"},
},
},
{"$sort": transformSort(sortField, sortOrder)},
// snipped additional stages to perform pagination
},
},
)