Mongodb mongo中如何按任意列表对对象数组进行排序

Mongodb mongo中如何按任意列表对对象数组进行排序,mongodb,mongoose,Mongodb,Mongoose,我在寻找一种按任意列表对对象数组进行排序的方法。假设我有这个对象数组 [ { "_id": "4JEEuhNIae", "category": "grocery" }, { "_id": "4JW7miNITl", "category": "food" }, { "_id": "4Je4kmrrbZ", "category": "coffee" }, { "_id": "4JgAh3N86x", "category":

我在寻找一种按任意列表对对象数组进行排序的方法。假设我有这个对象数组

[
  {
   "_id": "4JEEuhNIae",
   "category": "grocery"
  },
  {
   "_id": "4JW7miNITl",
   "category": "food"
  },
  {
   "_id": "4Je4kmrrbZ",
   "category": "coffee"
  },
  {
   "_id": "4JgAh3N86x",
   "category": "coffee"
  }
]
这是我想用作排序标准的数组。食品的记录应该首先出现,然后是咖啡和杂货

['food','coffee','grocery']
结果应该是:

[
  {
   "_id": "4JW7miNITl",
   "category": "food"
  },
  {
   "_id": "4Je4kmrrbZ",
   "category": "coffee"
  },
  {
   "_id": "4JgAh3N86x",
   "category": "coffee"
  },
  {
   "_id": "4JEEuhNIae",
   "category": "grocery"
  },
]

如何使用mongoose在mongodb上进行此类排序?我真的不想在获取数据后对代码进行任何操作。

您可以尝试在从方法返回的数组上使用本机JavaScript方法运行自定义比较器函数:

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操作符

  • 管道步骤允许您在不知道所有其他现有字段的情况下,将新字段添加到现有文档中
  • 表达式返回给定数组中特定元素的位置
总之,您可以尝试以下聚合操作(使用MongoDB 3.4):


您的代码是文档中的列表字段吗?或者它是一个文档列表?@SergiuZaharie它是一个文档列表似乎我不能直接为mongoose编写自定义排序函数,我需要使用
db.eval
好的,谢谢
var order = ["food", "coffee", "grocery"],
    projection = { 
        "$addFields" : { 
            "__order" : { "$indexOfArray" : [ order, "$category" ] } 
        } 
    },
    sort = { "$sort" : { "__order" : 1 } };
db.collection.aggregate([ projection, sort]);