0

假设我有集合 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 识别,但按直接顺序排序。

4

1 回答 1

1

在 Mongoose 3.x 中,您可以将字符串传递给Query#sort来执行此操作:

Foo.find().sort('-b -a').exec(callback);
于 2012-10-11T12:28:19.767 回答