我有以下结果数据,但未根据我的需要正确排序
[
{
"_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 具有相同的索引,则它会移动到第三个索引
您可以提供我将在最后一个选项中使用的任何聚合查询解决方案,但我不喜欢这里的任何聚合。
这只是使用聚合来实现此目的的一种方法。一定有无限的可能性,但是这个已经经过测试并且有效(我已将类别 id 更改为名称,但这是相同的概念)。
请注意,我添加了您可能不需要的额外第一个
$match
阶段,因此请随意删除它,最后一个 $project
阶段刚刚清理完毕,因此您也许可以删除该阶段还有。
[ { '$匹配': { “类别”:{ '$elemMatch': { “类别”:“category_789” } } } }, { '$项目': { '_id': 1, “类别”:1、 '排序类别':{ '$过滤器': { '输入': '$类别', '如':'c', '条件': { '$eq': [ '$$c.category', 'category_789' ] } } } } }, { '$排序': { 'sortCategory.positionAccordingToCategory':-1 } }, { '$项目': { '_id': 1, “类别”:1 } } ]