mongodb - 如何按自定义顺序对 Mongo 中的数据进行排序

标签 mongodb mongodb-query

我如何使用 Mongo 功能对这些数据进行排序:

输入

{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
{ "_id" : 2, "domainName" : "test2.com", "hosting" : "aws.amazon.com"}
{ "_id" : 3, "domainName" : "test3.com", "hosting" : "aws.amazon.com" }
{ "_id" : 4, "domainName" : "test4.com", "hosting" : "hostgator.com" }
{ "_id" : 5, "domainName" : "test5.com", "hosting" : "aws.amazon.com" }
{ "_id" : 6, "domainName" : "test6.com", "hosting" : "cloud.google.com" }
{ "_id" : 7, "domainName" : "test7.com", "hosting" : "aws.amazon.com" }
{ "_id" : 8, "domainName" : "test8.com", "hosting" : "hostgator.com" }
{ "_id" : 9, "domainName" : "test9.com", "hosting" : "cloud.google.com" }
{ "_id" : 10, "domainName" : "test10.com", "hosting" : "godaddy.com" }

按照托管字段的顺序,获取结果,例如按以下顺序:

1)首先 - 所有的godaddy;

2) 其次——所有 AWS;

3)接下来,其他一切。

输出
{
    "result" : [
            {

                    "_id" : 10, 
                    "domainName" : "test10.com",
                    "hosting" : "godaddy.com"
            },
            {
                    "_id" : 2, 
                    "domainName" : "test2.com",
                    "hosting" : "aws.amazon.com"
            },
            {
                    "_id" : 3, 
                    "domainName" : "test3.com",
                    "hosting" : "aws.amazon.com"
            },
            {
                    "_id" : 5, 
                    "domainName" : "test5.com",
                    "hosting" : "aws.amazon.com"
            },
            {
                    "_id" : 7, 
                    "domainName" : "test7.com",
                    "hosting" : "aws.amazon.com"
            },
            {
                    "_id" : 1, 
                    "domainName" : "test1.com",
                    "hosting" : "hostgator.com"
            },
            {
                    "_id" : 4, 
                    "domainName" : "test4.com",
                    "hosting" : "hostgator.com"
            },
            {
                    "_id" : 6, 
                    "domainName" : "test6.com",
                    "hosting" : "cloud.google.com"
            },
            {
                    "_id" : 8, 
                    "domainName" : "test8.com",
                    "hosting" : "hostgator.com"
            },
            {
                    "_id" : 9, 
                    "domainName" : "test9.com",
                    "hosting" : "cloud.google.com"
            },
    ]
    }

在这个例子中,我想以更相关的方式为用户返回结果。在原始任务中,我想使用其他一些提供附加信息的集合对其进行排序。

但是如果你帮助我完成以前的任务就足够了吗?

UPD: 关于问题的第二部分。

另一项任务是如何从一个集合中返回可排序的数据,并依赖于另一个集合。

例子:

第一个集合与之前给出的相同:
 { "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
 ...

第二个集合,提供一些关于托管的额外信息:
{ '_id': 123, 'quality':'best', 'hostings': ["hostgator.com",  "aws.amazon.com"]},
{ '_id': 321, 'quality':'good', 'hostings': ["cloud.google.com"]},
{ '_id': 345, 'quality':'bad', 'hostings': ["godaddy.com"]},

结果,我需要按以下顺序从第一个收集数据返回:

1)首先所有好的主机
2)其次一切都好
3)第三个都不好

输出:
{
"result" : [
        //Best:
        {
                "_id" : 1, 
                "domainName" : "test1.com",
                "hosting" : "hostgator.com"
        },
        {
                "_id" : 4, 
                "domainName" : "test4.com",
                "hosting" : "hostgator.com"
        },
        {
                "_id" : 8, 
                "domainName" : "test8.com",
                "hosting" : "hostgator.com"
        },
        {
                "_id" : 2, 
                "domainName" : "test2.com",
                "hosting" : "aws.amazon.com"
        },
        {
                "_id" : 3, 
                "domainName" : "test3.com",
                "hosting" : "aws.amazon.com"
        },
        {
                "_id" : 5, 
                "domainName" : "test5.com",
                "hosting" : "aws.amazon.com"
        },
        {
                "_id" : 7, 
                "domainName" : "test7.com",
                "hosting" : "aws.amazon.com"
        },

       // Good:
        {
                "_id" : 9, 
                "domainName" : "test9.com",
                "hosting" : "cloud.google.com"
        },
        {
                "_id" : 6, 
                "domainName" : "test6.com",
                "hosting" : "cloud.google.com"
        },

       //Bad
        {
                "_id" : 10, 
                "domainName" : "test10.com",
                "hosting" : "godaddy.com"
        }
]
}

更新 2

我在前面的例子中得到了很好的答案和例子。非常感谢!但我举另一个例子。

我需要比较 3 个集合的 ID 以按顺序排序 - 第一个: friend ,第二个:“请求”,以及:其他用户。

输入
db.friends.find({userId: currentUser});
    // {"_id" : "PgC7LrtaZtQsShtzT", "userId" : "tHuxnWxFLHvcpRgHb", "friendId" : "jZagPF7bd4aW8agXb",}
db.requests.find({userId: currentUser});
   // looks like friend but with 'requesterId'

现在我需要聚合“用户”集合,定义与前两个集合( friend 、请求)匹配的分数。

使用提供的答案,我管理了结果,但只有一个集合。我怎样才能用 3 个或多个来做这个?

最佳答案

您可以将每个 hosting 投影到由整数表示的单独类型,最后对这些整数进行排序。在下面的聚合管道中说明

[
{$lookup: {
    from: 'secondCollectionStoringQuality',
    localField: 'hosting',
    foreignField: 'hostings',
    as: 'nw'
    }},
{$unwind: '$nw'},
{$project: {
        domainName: 1,
        hosting: 1,
        type: {
            $cond: [
                {$eq: ['$nw.quality', 'best']},
                0,
                {$cond: [
                    {$eq: ['$nw.quality', 'good']},
                    1,
                    2
                    ]}
            ]
        }
    }},
    {$sort: {type: 1}}
]

关于mongodb - 如何按自定义顺序对 Mongo 中的数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40803878/

相关文章:

java - createDatastore 是否具有破坏性?

ruby-on-rails - 使用 mongodb 进行简单的 boolean 数据更新?

java - 列表列表中的 Spring Mongo 标准

javascript - 根据用户个人资料中的数组在集合中查找

python - 如何在 mongoengine 中使用有序 false 进行批量插入

mongodb - Meteor 将自定义字段添加到 Meteor.users : should I do it?

java - 使用roo用mongo创建springsource项目

javascript - mongodb - 没有本地的聚合查找

mongodb - mongodb 中的 dbref 命令

javascript - ".findOneAndUpdate()"未正确更新数据库(Mongodb 和 Node.js)