在顶部排序和放置匹配的值

时间:2015-07-15 13:47:23

标签: node.js mongodb mongodb-query

我使用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
    });
});

1 个答案:

答案 0 :(得分:0)

您无法在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对该“加权”进行排序(在这种情况下从最高位开始降序),以便在加权较低的其他值之前列出这些值。