复杂的排序与MongoDB的+ Sails.js

问题描述 投票:3回答:2

我正在开发使用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 
    }) 
});

但我没能实现这个使用帆和水线ORM。我会用在必要时本机连接,但我不知道该怎么做。

请帮帮我,谢谢你了很多!

node.js mongodb sails.js mongodb-query aggregation-framework
2个回答
2
投票

您需要使用.aggregate()方法可用于访问聚合管道。在管道的第一阶段是在您使用的$project操作返回“键1”和“KEY2”的区别$subtract阶段。

在管道中的最后一步,是您在升序使用$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场,但这样做会导致性能的下降。而一般来说,你不应该在你的查询结果担心一个附加字段。


1
投票

如果您key1key2之间的差异意味着那种,我不认为它可以用一个简单的查找来完成,我想你会需要使用聚集。

注:我不熟悉Sail.js,所以我会写在mongoshell查询,让你翻译扬帆

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

不知道你想究竟是如何最终输出的样子,所以你可能想在最后添加一些其他项目。

© www.soinside.com 2019 - 2024. All rights reserved.