我正在开发使用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。我会用在必要时本机连接,但我不知道该怎么做。
请帮帮我,谢谢你了很多!
您需要使用.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
场,但这样做会导致性能的下降。而一般来说,你不应该在你的查询结果担心一个附加字段。
如果您key1
和key2
之间的差异意味着那种,我不认为它可以用一个简单的查找来完成,我想你会需要使用聚集。
注:我不熟悉Sail.js,所以我会写在mongoshell查询,让你翻译扬帆
db.user.aggregate([
{
$project:{
doc: "$$ROOT",
sortOrder: { $subtract: ["$key1", "$key2"] }
}
},
{
$sort:{ sortOrder: 1}
}
]);
不知道你想究竟是如何最终输出的样子,所以你可能想在最后添加一些其他项目。