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