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)
| 归档时间: |
|
| 查看次数: |
6059 次 |
| 最近记录: |