【问题标题】:Sorting and placing matched values on top对匹配的值进行排序并将其放在顶部
【发布时间】:2015-07-15 21:57:44
【问题描述】:

我正在使用 MongoDB 和 Node.js 在页面中显示记录集。我已经按字母顺序在页面上显示它们,但我想在顶部显示一行(“默认”行),在其下方按字母顺序显示所有其他行。

我知道,我知道,Mongo 绝对不是 SQL,但在 SQL 中我会做这样的事情:

SELECT * 
FROM themes
ORDER BY name != "Default", name ASC;

甚至可能

SELECT * FROM themes WHERE name  = "Default"
UNION
SELECT * FROM themes WHERE name != "Default" ORDER BY name ASC;

我尝试了几种 Mongo 排序选项的变体,例如

"$orderby": {'name': {'$eq': 'Default'}, 'name': 1}}

但到目前为止没有任何运气。我一直在寻找解决这个问题的方法,但我没有找到任何东西。我是 Mongo 的新手,但也许我做错了。

我目前的基本代码:

var db = req.db;
var collection = db.get('themes');

collection.find({"$query": {}, "$orderby": {'name': 1}}, function(e, results) {
    res.render('themes-saved', {
        title: 'Themes',
        section: 'themes',
        page: 'saved',
        themes: results
    });
});

【问题讨论】:

    标签: node.js mongodb mongodb-query


    【解决方案1】:

    您无法在 MongoDB 中执行此操作,因为排序必须基于文档字段中已存在的特定值。您“可以”做的是$project 对符合您条件的记录进行“加权”。如:

    collection.aggregate(
        [
            { "$project": {
                "each": 1,
                "field": 1,
                "youWant": 1,
                "name": 1,
                "weight": {
                    "$cond": [
                        { "$eq": [ "$name", "Default" ] },
                        10,
                        0
                    ]
                }
            }},
            { "$sort": { "weight": -1, "name": 1 } }
        ],
        function(err,results) {
    
        }
    );
    

    因此,您在逻辑上检查要匹配(或其他逻辑)中的值的字段,然后为该字段分配一个值,并将较低的分数或0 分配给不匹配的值。

    然后,当您 $sort 按顺序(在这种情况下从最高值降序)上首先对该“权重”进行排序时,以便将这些值列在权重较低的其他值之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 2022-11-20
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多