在Mongoose中排序无法正常工作

时间:2012-06-30 17:43:26

标签: node.js mongodb mongoose

排序不适用于Mongoose,但我不明白这是怎么可能的,因为我搜索了这么多!任何时候我尝试它都没有用。这是我的代码

Pics.find({}).limit(8).populate('creator').sort("created_at", 1).execFind(function(err, docs){
    console.log(docs);
});

我明白了:

TypeError: Invalid sort() argument. Must be a string or object.
at Query.sort (/Users/n/Proj/feetshot/node_modules/mongoose/lib/query.js:755:11)
at /Users/n/Proj/feetshot/app.js:112:45
at callbacks (/Users/n/Proj/feetshot/node_modules/express/lib/router/index.js:272:11)
at param (/Users/n/Proj/feetshot/node_modules/express/lib/router/index.js:246:11)
at pass (/Users/n/Proj/feetshot/node_modules/express/lib/router/index.js:253:5)
at Router._dispatch (/Users/n/Proj/feetshot/node_modules/express/lib/router/index.js:280:4)
at Object.handle (/Users/n/Proj/feetshot/node_modules/express/lib/router/index.js:45:10)
at Context.next (/Users/n/Proj/feetshot/node_modules/express/node_modules/connect/lib/http.js:204:15)
at Context.<anonymous> (/Users/n/Proj/feetshot/node_modules/passport/lib/passport/context/http/actions.js:64:8)
at SessionStrategy.pass (native)

如何使排序工作?

这是我的架构:

var PicSchema = new Schema({
creator: { type: Schema.ObjectId, ref: 'Users' }
, body: String
, created_at: { type: Date, default: Date.now }
, link: { type: String, index: { unique: true } }
, twitter_id: { type: String, index: { unique: true } }
, tags: [String]
  , likes: [{ type: Schema.ObjectId, ref: 'Users' }]
   });

2 个答案:

答案 0 :(得分:4)

根据您的错误消息,您必须使用Mongoose 3.x,但是您使用的是2.x sort方法参数样式。切换到2.7.0 Mongoose版本或将您的排序使用情况更改为sort('created_at')。来自3.x来源:

/**
* sort
*
* Sets the sort order. Accepts a single parameter, either an object or string.
* If an object is passed values allowed are 'asc', 'desc', 'ascending', 'descending', 1, -1.
* If a string is passed it must be a space delimited list of path names. The sort order of each path is ascending unless the path name is prefixed with `-` which will be treated as descending.
*
* Examples:
*
* // these are equivalent
* query.sort({ field: 'asc', test: -1 });
* query.sort('field -test');
*
* @param {Object|String}
* @api public
*/

答案 1 :(得分:0)

尝试

  1. 使用字符串
  2. 更正排序方法调用
  3. 提前做好。在填充之前。
  4. 所以:

    Pics.find({}).sort("created_at").limit(8).populate('creator').execFind(function(err, docs){
        console.log(docs);
    });