我一直在寻找一种通过任意列表对对象数组进行排序的方法。让我们假设我有这个对象数组。
[
{
"_id": "4JEEuhNIae",
"category": "grocery"
},
{
"_id": "4JW7miNITl",
"category": "food"
},
{
"_id": "4Je4kmrrbZ",
"category": "coffee"
},
{
"_id": "4JgAh3N86x",
"category": "coffee"
}
]
这是我想用作排序标准的数组。应首先使用food
的记录,然后是coffee
和grocery
。
['food','coffee','grocery']
结果应该是:
[
{
"_id": "4JW7miNITl",
"category": "food"
},
{
"_id": "4Je4kmrrbZ",
"category": "coffee"
},
{
"_id": "4JgAh3N86x",
"category": "coffee"
},
{
"_id": "4JEEuhNIae",
"category": "grocery"
},
]
如何使用mongoose在mongodb上进行这种类型的排序?我真的不想在获取数据后对代码进行任何操作。
答案 0 :(得分:2)
您可以尝试使用 sort()
方法返回的数组上的原生JavaScript cursor.toArray()
方法运行自定义比较器功能:
var order = ["food", "coffee", "grocery"];
var docs = db.collection.find().toArray().sort(function(a, b) {
return order.indexOf(a.category) - order.indexOf(b.category);
});
printjson(docs);
示例输出
[
{
"_id" : "4JW7miNITl",
"category" : "food"
},
{
"_id" : "4Je4kmrrbZ",
"category" : "coffee"
},
{
"_id" : "4JgAh3N86x",
"category" : "coffee"
},
{
"_id" : "4JEEuhNIae",
"category" : "grocery"
}
]
使用新的MongoDB 3.4版本,您应该能够利用本机MongoDB运算符 $addFields
和 $indexOfArray
聚合框架。
$addFields
管道步骤可让您 $project
新字段到现有文档,而无需了解所有其他现有字段。 $indexOfArray
表达式返回给定数组中特定元素的位置。因此,完全可以尝试以下聚合操作(使用MongoDB 3.4):
var order = ["food", "coffee", "grocery"],
projection = {
"$addFields" : {
"__order" : { "$indexOfArray" : [ order, "$category" ] }
}
},
sort = { "$sort" : { "__order" : 1 } };
db.collection.aggregate([ projection, sort]);