使用 Mongo 中间件按不同的排序方向对 3 列进行排序

Sort 3 columns in different sort directions using Mongo Middleware

使用Mongo中间件时,可以配置多列升序/降序,如示例

You may also specify ascending and descending sorts together:

var options = {
    sort : {
        asc : 'name'
        desc : ['birthday', 'home']
    }
};

我想解决的问题是如何让每一列都有自己配置的排序方向。

中间件排序配置似乎只支持两个配置节点(asc & desc)。

无法执行以下操作。

var options = {
    sort : {
        name: 'asc',
        birthday: 'desc',
        home: asc
    }
};

好吧,看起来您真正需要做的就是调用插件的正常 .sort() method from Mongoose instead of the .order() 方法:

var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;

require('mongoose-middleware').initialize(mongoose);

mongoose.connect('mongodb://localhost/test');

var testSchema = new Schema({
  a: Number,
  b: Number,
  c: Number
});

var Test = mongoose.model( 'Test', testSchema );

async.series(
  [
    function(callback) {
      Test.remove({},callback);
    },
    function(callback) {
      async.each(
        [
          { a: 1, b: 2, c: 3 },
          { a: 2, b: 1, c: 4 },
          { a: 4, b: 3, c: 1 },
          { a: 2, b: 2, c: 1 }
        ],
        function(item,callback) {
          Test.create(item,callback);
        },
        callback
      );
    },

    function(callback) {
      Test.find().sort("a -b c").page({
        start: 0,
        count: 3
      },function(err,docs) {
        console.log(docs);
        callback(err);
      });
    }
  ],
  function(err) {
    if (err) throw err;
    mongoose.disconnect();
  }
);

其中returns正常情况下受中间件本身影响的结果:

{ options: { start: 0, count: 3 },
  results:
   [ { _id: 55da9c9593d2c4ed0d26cf79, a: 1, b: 2, c: 3, __v: 0 },
     { _id: 55da9c9593d2c4ed0d26cf7c, a: 2, b: 2, c: 1, __v: 0 },
     { _id: 55da9c9593d2c4ed0d26cf7a, a: 2, b: 1, c: 4, __v: 0 } ],
  total: 4 }

因此,影响光标的标准方法似乎最适合在这种情况下使用。

如果你真的想要,那么只需将反映分页选项的内容放入配置中即可。除非实际调用特定的 .order() 方法,否则这显然无关紧要:

var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;

require('mongoose-middleware').initialize(mongoose);

mongoose.connect('mongodb://localhost/test');

var testSchema = new Schema({
  a: Number,
  b: Number,
  c: Number
});

var Test = mongoose.model( 'Test', testSchema );

async.series(
  [
    function(callback) {
      Test.remove({},callback);
    },
    function(callback) {
      async.each(
        [
          { a: 1, b: 2, c: 3 },
          { a: 2, b: 1, c: 4 },
          { a: 4, b: 3, c: 1 },
          { a: 2, b: 2, c: 1 }
        ],
        function(item,callback) {
          Test.create(item,callback);
        },
        callback
      );
    },

    function(callback) {
      Test.find().sort({ a: 1, b: -1, c: 1 }).page({
        start: 0,
        count: 3,
        sort: {
          a: 1,
          b: -1,
          c: 1,
        }
      },function(err,docs) {
        console.log(docs);
        callback(err);
      });
    }
  ],
  function(err) {
    if (err) throw err;
    mongoose.disconnect();
  }
);

而 "options" 实际上只是 "dumped out":

{ options: { start: 0, count: 3, sort: { a: 1, b: -1, c: 1 } },
  results:
   [ { _id: 55da9e12c74b0e0b0eeec3cf, a: 1, b: 2, c: 3, __v: 0 },
     { _id: 55da9e12c74b0e0b0eeec3d2, a: 2, b: 2, c: 1, __v: 0 },
     { _id: 55da9e12c74b0e0b0eeec3d0, a: 2, b: 1, c: 4, __v: 0 } ],
  total: 4 }

其中 { a: 1, b: -1, c: 1 } 是支持排序操作的标准 MongoDB 形式,尽管 mongoose 提供了扩展语法。所以它仍然有效。