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在mongodb中按升序和降序对多个字段进行排序
Paginate Mongoose / MongoDB查询:从一个点开始按两个字段排序[重复]