假设我有收集foo:
> db.foo.find()
{ "_id" : ObjectId("5076865a72da558dd40c819d"), "a" : 1, "b" : 5 }
{ "_id" : ObjectId("5076866f5c70b3b37c048494"), "a" : 2, "b" : 4 }
{ "_id" : ObjectId("5076866f5c70b3b37c048495"), "a" : 3, "b" : 6 }
{ "_id" : ObjectId("507686835c70b3b37c048496"), "a" : 0, "b" : 4 }
我想按b
排序,然后按a
排序:
> db.foo.find().sort({b:-1,a:-1})
{ "_id" : ObjectId("5076866f5c70b3b37c048495"), "a" : 3, "b" : 6 }
{ "_id" : ObjectId("5076865a72da558dd40c819d"), "a" : 1, "b" : 5 }
{ "_id" : ObjectId("5076866f5c70b3b37c048494"), "a" : 2, "b" : 4 }
{ "_id" : ObjectId("507686835c70b3b37c048496"), "a" : 0, "b" : 4 }
显然,传递给sort()的哈希保留了键的顺序:
> db.foo.find().sort({a:-1,b:-1})
{ "_id" : ObjectId("5076866f5c70b3b37c048495"), "a" : 3, "b" : 6 }
{ "_id" : ObjectId("5076866f5c70b3b37c048494"), "a" : 2, "b" : 4 }
{ "_id" : ObjectId("5076865a72da558dd40c819d"), "a" : 1, "b" : 5 }
{ "_id" : ObjectId("507686835c70b3b37c048496"), "a" : 0, "b" : 4 }
我需要的是在使用mongoosejs作为DB包装器的Node.js应用程序中复制此行为。我知道有一个排序参数我可以用
Foo.find({},[],{sort:{b:-1}}, callback)
有两个参数会让我感到困惑,因为Foo.find({},[],{sort:{b:-1, a:-1}}, callback)
和Foo.find({},[],{sort:{a:-1, b:-1}}, callback)
都会以相同的顺序返回元素(按a
排序) - 正如它应该的那样,因为很明显哈希/对象没有键顺序。
我知道你可以传递数组(例如['b','a']
),但我仍然不确定如何设置反向顺序:['-b','-a']
,虽然被mongoosejs识别,但是按直接顺序排序。
答案 0 :(得分:1)
在Mongoose 3.x中,您可以将一个字符串传递给Query#sort来执行此操作:
Foo.find().sort('-b -a').exec(callback);