如何在MongoDB中按字段值排序

3

在Mysql中,我经常在ORDER BY子句中使用FIELD()函数:

ORDER BY FIElD(id, '1', '6', '3', ...);

如何在MongoDB中获得相同的结果?我尝试了以下方法:

.find(...).sort({id: [1, 6, 3]})

但这并没有起作用。


可能是重复的问题:Mongo:如何按外部权重排序 - Neil Lunn
我之所以这么说,是因为有一种方法可以将$cond运算符应用于这些“值”,以应用该“加权”函数。 - Neil Lunn
1
您可以使用聚合框架来完成此操作,如下所示。但是,与SQL不同,它不会使用索引,因此它不仅在RAM使用方面受到限制,而且随着插入的数据越来越多,速度也会呈指数级变慢。 - Sammaye
谢谢你的回答,这种排序更多是我的应用程序中的“好功能”,而不是必需品,也许我会将其留出。 - Saif Bechan
有一个 JIRA 专门用于正确处理这个问题,因此并不总是必须使用聚合框架,这更像是一种 hack。 - Sammaye
记录一下。在支持此语法的SQL引擎中,索引会被“丢弃”,而使用简单的哈希匹配。因此效率不是很高。 - Neil Lunn
2个回答

4
我们可以使用$indexOfArray
控制台
db.collectionName.aggregate([{
    $match: {
        _id: {
            $in: [249, 244]
        }
    }
}, {
    $addFields: {
        sort: {
            $indexOfArray: [
                [249, 244], "$_id"
            ]
        }
    }
},{
    $sort: {
        sort: 1
    }
}])

PHP代码

$data = $this->mongo->{$collectionName}->aggregate(
    [
        [
            '$match' => ['_id' => ['$in' => $idList]]
        ],
        [
            '$addFields' => ['sort' => ['$indexOfArray' => [$idList, '$_id']]]
        ],
        [
            '$sort' => ['sort' => 1]
        ],
        [
            '$project' => [
                'name' => 1
            ]
        ]
    ]
);

3

记录如下:

假设有数组 [1,6,3],你需要查询的是:

db.collection.aggregate([
   { "$project": {
       "weight": { "$cond": [
           { "$eq": ["_id": 1] },
           3, 
           { "$cond": [
               { "$eq": ["_id": 6] },
               2,
               { "$cond": [
                   { "$eq": ["_id": 3] },
                   1,
                   0
               ]},
           ]}, 
       ]}
   }},
   { "$sort": { "weight": -1 } }
])

这会按照你输入的“数组”顺序为你提供特定的“权重”,以便在结果上“投射”这些权重。


看起来比我预想的要复杂得多。我会尝试一下,谢谢您的答案。顺便说一句,您投票关闭了这个问题,您确定这是唯一可能的解决方案,并且将一直持续到最后一天吗,哈哈? - Saif Bechan
@SaifBechan 我非常确定在这里提供外部“权重”的方式只有一种,就像你的“平台特定”的SQL所示。因此,是的,我非常确定在做了26年以上的工作后,在这里我说话是有一定权威性的。 - Neil Lunn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接