Mongoose 按填充字段排序

Posted

技术标签:

【中文标题】Mongoose 按填充字段排序【英文标题】:Mongoose sort by populated field 【发布时间】:2015-09-19 17:45:28 【问题描述】:

我有以下shemas:

var BrandSchema = 新架构( 姓名: 类型:字符串, 要求:真, 指数: 唯一:真 , 小写:真 , 商标: 类型:对象标识, 参考:'图像' ); var FollowActionSchema = 新架构( “行动日期”: 类型:日期, “默认”:日期。现在 , '品牌': 类型:对象标识, 参考:“品牌” , “表演者”: 类型:对象标识, 参考:'用户' , 'type': String // followUser、folloBrand、followMerchant );

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

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

我做的查询是:

异步瀑布([ 功能查找操作(下一个) 变量选项 = 询问: 执行者:用户 ID, $或:[ 类型:“关注品牌” , 类型:'followMerchant' ] , 投影: 行动日期:1, 品牌:1、 商户:1、 类型:1 , 排序:'-actionDate', 分页:分页 ; utils.limitQuery('FollowAction', options, next); , 函数膨胀(动作,下一个) 总计=actions.count; 变量选项 = 投影: 姓名:1, _id:1, 用户名:1 ; async.eachSeries(actions.result, function(action, done) 异步瀑布([ 功能膨胀动作(完成) action.inflate(选项,完成); , 功能 addToArray(项目,完成) 受信任的.push( _id:item._id, 名称:utils.capitalize(item.name || item.username), 类型:项目名称? “品牌”:“商家” ); 返回完成(空,项目); ], 完毕); , 下一个); ],函数(错误) 回调(错误,可信,总计); );

【问题讨论】:

您是否尝试过在填充之前进行排序? 请问您可以在查询的地方发布您的实际代码吗?所以我们可以与我们的整合。 我用查询编辑了原始帖子。在填充此字段之前可以使用填充字段进行排序吗? 【参考方案1】:

从这个简单的例子中得到灵感

 Post.find('_id': userId)
           .limit(10)
           .skip(0)
           .sort('created_at':-1) // this is used to sort
           .exec(function(error, result)
            if(!error)
              // console.log(result);
              res.send(data:result);
             else
              console.log(error);
            
        );

【讨论】:

这根本不回答 OP 问题 XD【参考方案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'
  ,
  // ...
);

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

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

var aBrand = // some brand object

var f = new FollowAction(
   brand: aBrand._id,
   brandSortKey: aBrand.name
   // other properties
); 

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

FollowAction.find()
   .sort( brandSortKey:1 )
   .exec(function (err, sortedResults) 
       // do something with sorted results.
   );

【讨论】:

哦,现在我看到这个问题是 11 个月前提出的。叹。所以 n00b 回答失败。 :)

以上是关于Mongoose 按填充字段排序的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 填充排序选项

使用 Mongoose.js 按嵌套数组中的字段排序

使用mongoose在mongodb中按升序和降序对多个字段进行排序

Paginate Mongoose / MongoDB查询:从一个点开始按两个字段排序[重复]

Mongoose - 无法在路径 notification.from 上使用排序填充,因为它是文档数组的子属性

Mongoose:引用自定义字段名称