【问题标题】:Complex sort with MongoDB + Sails.js使用 MongoDB + Sails.js 进行复杂排序
【发布时间】:2016-02-28 18:02:15
【问题描述】:

我正在使用 Sails.js 和 MongoDB 开发一个 Web 应用程序。我必须查询数据库并通过复杂的函数对结果进行排序。其实并不复杂,但比按键排序更难。在这种情况下,我有这个集合

用户

{ user : "Luis", key1 : 23, key2 : 29 };
{ user : "Juan", key1 : 53, key2 : 22 };
{ user : "Paco", key1 : 26, key2 : 42 }; 

我正在尝试按key1 - key2 获取结果顺序

我已尝试使用 Mongo complex sorting? 帐户进行不同的查询,但这对我没有帮助。

User.find({}).sort(function(doc1,doc2){return doc1.a . doc2.b })
 .exec(function(err,users){console.log(users)});

我已经检查过这种方式在 Robomongo 控制台(MongoDB GUI 客户端)中运行正常。

db.eval(function() { 
    return db.scratch.find().toArray().sort(function(doc1, doc2) { 
        return doc1.a - doc2.a 
    }) 
});

但我无法使用 Sails 和水线 orm 来实现这一点。如有必要,我会使用本机连接,但我不知道该怎么做。

请帮帮我,非常感谢!

【问题讨论】:

  • 您的意思是按key1key2 之间的差异排序吗?
  • 是的,我的意思是按key1key2 之间的差异排序

标签: node.js mongodb sails.js mongodb-query aggregation-framework


【解决方案1】:

您需要使用提供对聚合管道的访问的.aggregate() 方法。管道中的第一阶段是 $project 阶段,您使用 $subtract 运算符返回“key1”和“key2”的差异。

管道的最后一步是$sort 阶段,您可以使用{ 'diffkey': 1 } 升序或降序{ 'diffkey': -1 } 对文档进行排序。

db.user.aggregate([
    { '$project': { 
        'user': 1, 
        'key1': 1, 
        'key2': 1, 
        'diffkeys': { '$subtract': [ '$key1', '$key2' ] }
     }}, 
    { '$sort': { 'diffkeys': 1 } }
])

产量:

{
        "_id" : ObjectId("567d112eaac525feef33a5b7"),
        "user" : "Juan",
        "key1" : 53,
        "key2" : 22,
        "diffkeys" : -31
}
{
        "_id" : ObjectId("567d112eaac525feef33a5b6"),
        "user" : "Luis",
        "key1" : 23,
        "key2" : 29,
        "diffkeys" : 6
}
{
        "_id" : ObjectId("567d112eaac525feef33a5b8"),
        "user" : "Paco",
        "key1" : 26,
        "key2" : 42,
        "diffkeys" : 16
}

您可能想在管道中添加另一个额外的 $project 以从查询结果中过滤掉 diffkey 字段,但这样做会导致性能下降。一般来说,您不必担心查询结果中的一个额外字段。

【讨论】:

    【解决方案2】:

    如果您的意思是按key1key2 之间的差异进行排序,我认为不能通过简单的查找来完成,我认为您需要使用聚合。

    注意:我对Sail.js不熟悉,所以我会在mongoshell中编写查询,让你翻译成sails

    db.user.aggregate([
    {
        $project:{
            doc: "$$ROOT",
            sortOrder: { $subtract: ["$key1", "$key2"] }
        }
    },
    {
        $sort:{ sortOrder: 1}
    }
    ]);
    

    不确定您希望最终输出的效果如何,因此您可能希望在最后添加一些其他项目。

    【讨论】:

    • @luigonsec $$ROOT 是对正在解析的整个文档的引用。请参阅上面的文档here。基本上我不知道你在最终输出中做了什么或不想要什么信息,所以我把它全部拿走了。
    • ["$key1", "key2"] - 应该是 ["$key1", "$key2"]
    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多