首页 > 解决方案 > 在 MongoDB 中对一组子文档进行排序(不使用聚合)

问题描述

我正在尝试使用属于对象数组的字段在 Mongo 中进行排序。问题是我无法使用聚合,并且由于外部约束而无法修改架构。

这是我的文件的一个例子

[{
  "name": "product 1",
  "tags": [{
    "tag": "category",
    "value": "shoes"
  },{
    "tag": "gender",
    "value": "man"
  }]
},
{
  "name": "product 2",
  "tags": [{
    "tag": "category",
    "value": "bags"
  },{
    "tag": "season",
    "value": "fall-winter"
  }]
},
{
  "name": "product 3",
  "tags": [{
    "tag": "category",
    "value": "clothing"
  },{
    "tag": "gender",
    "value": "woman"
  }]
}]

假设我想使用标签类别对它们进行升序排序,所以我应该以这种方式对文档进行排序:“产品 2”、“产品 3”、“产品 1”

有没有一种方法可以在不聚合且不修改架构的情况下做到这一点?

标签: mongodbsorting

解决方案


...我不能使用聚合...

如果“类别”子文档是数组的第一个元素,则以下代码将进行排序。tags

db.product_cats.find().toArray().sort( (a, b) => {
    return a.tags[0].value > b.tags[0].value;
});

如果“类别”子文档出现在数组的任何索引处,则以下将进行排序。

db.product_cats.find().toArray().sort( (a, b) => {
    let ixa = a.tags.findIndex(e => e.tag == "category");
    let ixb = b.tags.findIndex(e => e.tag == "category"); 
    return a.tags[ixa].value > b.tags[ixb].value;
});

如果某些文档缺少“类别”子文档,那么这将进行排序:

db.product_cats.find().toArray().sort( (a, b) => {

    let ixa = a.tags.findIndex(e => e.tag == "category");
    let ixb = b.tags.findIndex(e => e.tag == "category");

    if ( ixa == -1 ) { a.tags = [ ]; a.tags[ ixa] = { value: "" } };
    if ( ixb == -1 ) { b.tags = [ ]; b.tags[ ixa] = { value: "" } };

    return a.tags[ixa].value > b.tags[ixb].value;
});

推荐阅读