gpt4 book ai didi

node.js - 使用 MongoDB + Sails.js 进行复杂排序

转载 作者:可可西里 更新时间:2023-11-01 09:35:33 26 4
gpt4 key购买 nike

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

用户

{ 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 和 waterline orm 来实现它。如有必要,我会使用 native 连接,但我不知道该怎么做。

请帮帮我,非常感谢!

最佳答案

您需要使用 .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 字段,但这样做会导致性能下降。一般来说,您不必担心查询结果中的一个额外字段。

关于node.js - 使用 MongoDB + Sails.js 进行复杂排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33925123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com