按数组中对象的字段排序,其中 id 与数组中的特定元素对象 id 匹配 NestJS 、 Mongodb

问题描述 投票:0回答:1

我有以下结果数据,但未根据我的需要正确排序

 [
 {
    "_id": "defmongodb_objectId",
    "categories": [
      {
        "category": "123mongodb_objectId" //reference Id
        "positionAccordingToCategory": 2,
      },
      {
        "category": "789mongodb_objectId" //reference Id
        "positionAccordingToCategory": 1,
      },
    ],
  },
  {
    "_id": "abcmongodb_objectId",
    "categories": [
      {
        "category": "789mongodb_objectId" //reference Id
        "positionAccordingToCategory": 2,
      },
    ],
  },
 {
    "_id": "0mongodb_objectId",
    "categories": [
      {
        "category": "789mongodb_objectId" //reference Id
        "positionAccordingToCategory": 0,
      },
    ],
  },

]

预期结果

   [
     
      {
        "_id": "abcmongodb_objectId",
        "categories": [
          {
            "category": "789mongodb_objectId" //reference Id
            "positionAccordingToCategory": 2,
          },
        ],
      },
      {
        "_id": "defmongodb_objectId",
        "categories": [
          {
            "category": "123mongodb_objectId" //reference Id
            "positionAccordingToCategory": 2,
          },
          {
            "category": "789mongodb_objectId" //reference Id
            "positionAccordingToCategory": 1,
          },
        ],
      },
     {
    "_id": "0mongodb_objectId",
    "categories": [
      {
        "category": "789mongodb_objectId" //reference Id
        "positionAccordingToCategory": 0,
      },
    ],
  },
]

我想按给定 id 与 positionAccordingToCategory 匹配的

category
对结果进行
排序

示例 提供的id是

789mongodb_objectId
,它是
categories
数组的第二个元素,所以我想要通过
positionAccordingToCategory
category
的结果,
789mongodb_objectId

问题 问题是,无论提供什么类别 ID,它都会对结果进行排序

by matching the **first** element of the categories array
。 基本上我想根据类别在不同类别的不同位置显示相同的文档。

我当前的查询

await this.myModel
      .find({
        // other filters
        categories: { $elemMatch: { category: 'category._id '} },
      })
      .sort({ 'categories.positionAccordingToCategory': -1 })

此查询仅在

categories
中只有单个对象元素时有效
not
就像查询
throws
任何
error
当有多个元素时,但问题是它
disturbs
特定类别列表中的
order
。如上面的示例所示,该元素应该在第一个索引处可见,但它会转到第二个索引,如果该类别中有另一个元素与 2 具有相同的索引,则它会移动到第三个索引

您可以提供我将在最后一个选项中使用的任何聚合查询解决方案,但我不喜欢这里的任何聚合。

mongodb mongodb-query nestjs
1个回答
0
投票

这只是使用聚合来实现此目的的一种方法。一定有无限的可能性,但是这个已经经过测试并且有效(我已将类别 id 更改为名称,但这是相同的概念)。

请注意,我添加了您可能不需要的额外第一个

$match
阶段,因此请随意删除它,最后一个
$project
阶段刚刚清理完毕,因此您也许可以删除该阶段还有。

[
  {
    '$匹配': {
      “类别”:{
        '$elemMatch': {
          “类别”:“category_789”
        }
      }
    }
  }, {
    '$项目': {
      '_id': 1, 
      “类别”:1、 
      '排序类别':{
        '$过滤器': {
          '输入': '$类别', 
          '如':'c', 
          '条件': {
            '$eq': [
              '$$c.category', 'category_789'
            ]
          }
        }
      }
    }
  }, {
    '$排序': {
      'sortCategory.positionAccordingToCategory':-1
    }
  }, {
    '$项目': {
      '_id': 1, 
      “类别”:1
    }
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.