我有一个收藏集:
{
_id: some object id,
title: "Example",
region: "US"
}
我想通过均衡按元素排序。
例如,如果region = US
,则将所有带有“ US”区域的元素放在结果的开头,然后将它们放在具有不同区域的元素之后。
我可以在MongoDB查询中执行此操作吗?如果是,那怎么办?
答案 0 :(得分:1)
可以通过使用Aggregation Pipeline
完成下面的查询将给出所需的输出
db.collection_name.aggregate([
{
$project: { _id: 1, title: 1, region: 1,
isCountryUS: {
$cond: { if: {
$eq: [ "US", "$region" ]
},
then: 1,
else: 0
}
}
}
},
{
$sort: { isCountryUS: -1, region: 1 }
},
{
$project: { _id: 1, title: 1, region: 1 }
}
]);
让我们收集20个文档的样本
{"_id":"5d19bb679735230010737312","title":"Example 1","region":"US"}
{"_id":"5d19bb679735230010737313","title":"Example 2","region":"US"}
{"_id":"5d19bb679735230010737314","title":"Example 3","region":"US"}
{"_id":"5d19bb679735230010737315","title":"Example 4","region":"US"}
{"_id":"5d19bb679735230010737316","title":"Example 5","region":"IND"}
{"_id":"5d19bb679735230010737317","title":"Example 6","region":"IND"}
{"_id":"5d19bb679735230010737318","title":"Example 7","region":"CAN"}
{"_id":"5d19bb679735230010737319","title":"Example 8","region":"CAN"}
{"_id":"5d19bb67973523001073731a","title":"Example 9","region":"UK"}
{"_id":"5d19bb67973523001073731b","title":"Example 10","region":"UK"}
{"_id":"5d19c0e09735230010737320","title":"Example 20","region":"US"}
{"_id":"5d19c0e09735230010737321","title":"Example 12","region":"MEX"}
{"_id":"5d19c0e09735230010737322","title":"Example 17","region":"MEX"}
{"_id":"5d19c0e09735230010737323","title":"Example 14","region":"MEX"}
{"_id":"5d19c0e09735230010737324","title":"Example 15","region":"FRA"}
{"_id":"5d19c0e09735230010737325","title":"Example 16","region":"FRA"}
{"_id":"5d19c0e09735230010737326","title":"Example 13","region":"ARG"}
{"_id":"5d19c0e09735230010737327","title":"Example 18","region":"ARG"}
{"_id":"5d19c0e09735230010737328","title":"Example 19","region":"GER"}
{"_id":"5d19c0e09735230010737329","title":"Example 11","region":"GER"}
当我们执行第一个$project时,我们得到以下结果
您可以看到,为方便起见,我们已经引入了新属性isCountryUS
{"_id":"5d19bb679735230010737312","title":"Example 1","region":"US","isCountryUS":1}
{"_id":"5d19bb679735230010737313","title":"Example 2","region":"US","isCountryUS":1}
{"_id":"5d19bb679735230010737314","title":"Example 3","region":"US","isCountryUS":1}
{"_id":"5d19bb679735230010737315","title":"Example 4","region":"US","isCountryUS":1}
{"_id":"5d19bb679735230010737316","title":"Example 5","region":"IND","isCountryUS":0}
{"_id":"5d19bb679735230010737317","title":"Example 6","region":"IND","isCountryUS":0}
{"_id":"5d19bb679735230010737318","title":"Example 7","region":"CAN","isCountryUS":0}
{"_id":"5d19bb679735230010737319","title":"Example 8","region":"CAN","isCountryUS":0}
{"_id":"5d19bb67973523001073731a","title":"Example 9","region":"UK","isCountryUS":0}
{"_id":"5d19bb67973523001073731b","title":"Example 10","region":"UK","isCountryUS":0}
{"_id":"5d19c0e09735230010737320","title":"Example 20","region":"US","isCountryUS":1}
{"_id":"5d19c0e09735230010737321","title":"Example 12","region":"MEX","isCountryUS":0}
{"_id":"5d19c0e09735230010737322","title":"Example 17","region":"MEX","isCountryUS":0}
{"_id":"5d19c0e09735230010737323","title":"Example 14","region":"MEX","isCountryUS":0}
{"_id":"5d19c0e09735230010737324","title":"Example 15","region":"FRA","isCountryUS":0}
{"_id":"5d19c0e09735230010737325","title":"Example 16","region":"FRA","isCountryUS":0}
{"_id":"5d19c0e09735230010737326","title":"Example 13","region":"ARG","isCountryUS":0}
{"_id":"5d19c0e09735230010737327","title":"Example 18","region":"ARG","isCountryUS":0}
{"_id":"5d19c0e09735230010737328","title":"Example 19","region":"GER","isCountryUS":0}
{"_id":"5d19c0e09735230010737329","title":"Example 11","region":"GER","isCountryUS":0}
然后在执行$sort之后,结果将被修改为
{"_id":"5d19bb679735230010737312","title":"Example 1","region":"US","isCountryUS":1}
{"_id":"5d19bb679735230010737313","title":"Example 2","region":"US","isCountryUS":1}
{"_id":"5d19bb679735230010737314","title":"Example 3","region":"US","isCountryUS":1}
{"_id":"5d19bb679735230010737315","title":"Example 4","region":"US","isCountryUS":1}
{"_id":"5d19c0e09735230010737320","title":"Example 20","region":"US","isCountryUS":1}
{"_id":"5d19c0e09735230010737326","title":"Example 13","region":"ARG","isCountryUS":0}
{"_id":"5d19c0e09735230010737327","title":"Example 18","region":"ARG","isCountryUS":0}
{"_id":"5d19bb679735230010737318","title":"Example 7","region":"CAN","isCountryUS":0}
{"_id":"5d19bb679735230010737319","title":"Example 8","region":"CAN","isCountryUS":0}
{"_id":"5d19c0e09735230010737324","title":"Example 15","region":"FRA","isCountryUS":0}
{"_id":"5d19c0e09735230010737325","title":"Example 16","region":"FRA","isCountryUS":0}
{"_id":"5d19c0e09735230010737328","title":"Example 19","region":"GER","isCountryUS":0}
{"_id":"5d19c0e09735230010737329","title":"Example 11","region":"GER","isCountryUS":0}
{"_id":"5d19bb679735230010737316","title":"Example 5","region":"IND","isCountryUS":0}
{"_id":"5d19bb679735230010737317","title":"Example 6","region":"IND","isCountryUS":0}
{"_id":"5d19c0e09735230010737321","title":"Example 12","region":"MEX","isCountryUS":0}
{"_id":"5d19c0e09735230010737322","title":"Example 17","region":"MEX","isCountryUS":0}
{"_id":"5d19c0e09735230010737323","title":"Example 14","region":"MEX","isCountryUS":0}
{"_id":"5d19bb67973523001073731a","title":"Example 9","region":"UK","isCountryUS":0}
{"_id":"5d19bb67973523001073731b","title":"Example 10","region":"UK","isCountryUS":0}
因此,在流水线执行的这一阶段,我们获得了期望的结果,但是具有一个附加属性(我们引入该属性是为了获得期望的结果)。我们可以通过仅在最后的$project
中投影所需的属性来过滤掉它所以我们的最终结果将是
{"_id":"5d19bb679735230010737312","title":"Example 1","region":"US"}
{"_id":"5d19bb679735230010737313","title":"Example 2","region":"US"}
{"_id":"5d19bb679735230010737314","title":"Example 3","region":"US"}
{"_id":"5d19bb679735230010737315","title":"Example 4","region":"US"}
{"_id":"5d19c0e09735230010737320","title":"Example 20","region":"US"}
{"_id":"5d19c0e09735230010737326","title":"Example 13","region":"ARG"}
{"_id":"5d19c0e09735230010737327","title":"Example 18","region":"ARG"}
{"_id":"5d19bb679735230010737318","title":"Example 7","region":"CAN"}
{"_id":"5d19bb679735230010737319","title":"Example 8","region":"CAN"}
{"_id":"5d19c0e09735230010737324","title":"Example 15","region":"FRA"}
{"_id":"5d19c0e09735230010737325","title":"Example 16","region":"FRA"}
{"_id":"5d19c0e09735230010737328","title":"Example 19","region":"GER"}
{"_id":"5d19c0e09735230010737329","title":"Example 11","region":"GER"}
{"_id":"5d19bb679735230010737316","title":"Example 5","region":"IND"}
{"_id":"5d19bb679735230010737317","title":"Example 6","region":"IND"}
{"_id":"5d19c0e09735230010737321","title":"Example 12","region":"MEX"}
{"_id":"5d19c0e09735230010737322","title":"Example 17","region":"MEX"}
{"_id":"5d19c0e09735230010737323","title":"Example 14","region":"MEX"}
{"_id":"5d19bb67973523001073731a","title":"Example 9","region":"UK"}
{"_id":"5d19bb67973523001073731b","title":"Example 10","region":"UK"}