Mongoose 按填充字段排序

Jav*_*nez 6 sorting mongoose mongodb node.js

好吧,我有以下shemas:

    var BrandSchema = new Schema({
      姓名: {
        类型:字符串,
        要求:真实,
        指数: {
          独特:真实
        },
        小写:真
      },
      标识: {
        类型:对象 ID,
        参考:'图像'
      }
    });

    var FollowActionSchema = 新架构({
      '动作日期':{
        类型:日期,
        '默认':Date.now
      },
      '牌': {
        类型:对象 ID,
        参考:“品牌”
      },
      “表演者”:{
        类型:对象 ID,
        参考:'用户'
      },
      'type': String // followUser, folloBrand, followMerchant
    });

我想要的是让用户关注品牌,按品牌名称排序,为此,我对 FollowAction 进行了查询,并找到了用户所做的所有 FollowAction,然后我填充了品牌字段。

所以问题是我无法对品牌名称的查询进行排序,我知道这样做的唯一方法是返回所有文档并从 nodejs 应用程序中对它们进行排序。有谁知道我该怎么做??或者如果我应该改变shema结构??

我做的查询是:

       异步瀑布([
        函数 findActions(next) {
          变量选项 = {
            询问: {
              表演者:用户ID,
              $或:[{
                类型:'跟随品牌'
              }, {
                类型:'关注商家'
              }]

            },
            投影:{
              行动日期:1,
              品牌: 1,
              商家: 1,
              类型:1
            },
            排序:'-actionDate',
            分页:分页
          };
          utils.limitQuery('FollowAction', options, next);
        },
        函数膨胀(动作,下一个){
          总计 = 动作数;
          变量选项 = {
            投影:{
              名称: 1,
              _id: 1,
              用户名:1
            }
          };
          async.eachSeries(actions.result, function(action, done) {
            异步瀑布([
              函数 inflateAction(done) {
                action.inflate(选项,完成);
              },
              函数 addToArray(item, done) {
                信任.推({
                  _id: item._id,
                  名称:utils.capitalize(item.name || item.username),
                  类型:项目名称?'品牌':'商家'
                });
                返回完成(空,项目);
              }
            ], 完毕);
          }, 下一个);
        }
      ], 函数(错误){
        回调(错误,可信,总计);
      });

小智 2

Mongoose API 似乎确实支持对填充字段进行排序,但有一个错误完全破坏了它: https: //github.com/Automattic/mongoose/issues/2202。你得到了一个结果,但这完全是错误的。

对于少量数据,可以使用 Javascript Array.prototype.sort()对结果数组进行排序。请记住,这会直接修改已排序的数组。

在本例中,我所做的是将排序键属性添加到要排序的模型的架构中。对于您的示例,您可以这样做:

var FollowActionSchema = new Schema({
  // ...
  'brandSortKey': { type: String },
  'brand': {
    type: ObjectId,
    ref: 'Brand'
  },
  // ...
});
Run Code Online (Sandbox Code Playgroud)

这并不完美,因为您必须自己使用正确的键显式设置此属性:

var FollowAction = Model('FollowAction', FollowActionSchema);

var aBrand = // some brand object

var f = new FollowAction({
   brand: aBrand._id,
   brandSortKey: aBrand.name
   // other properties
}); 
Run Code Online (Sandbox Code Playgroud)

但是,您可以直接通过 Mongoose API(或 MongoDB)进行排序:

FollowAction.find({})
   .sort({ brandSortKey:1 })
   .exec(function (err, sortedResults) {
       // do something with sorted results.
   });
Run Code Online (Sandbox Code Playgroud)