node.js - 我们如何使用 mongoose 和 expressjs-nodejs 对 mongodb 中的 ObjectId 列执行排序?
问题描述
我们是一个 mongodb 点的结构,我想在这里描述。
我们正在使用 mongoose 5.4 并创建如下模型:
var userSchema = mongoose.Schema({
id:{ type: Number, default: 1 },
first_name: String,
last_name: String,
mail: String,
password: String,
dob: { type: String, default: '' },
gender: { type: String, default: '' },
profile_photo: { type: String, default: '' },
ethnicity: { type: String, default: '' },
contact_number: { type: String, default: '' },
user_type: Number,
address1: { type: String, default: '' },
address2: { type: String, default: '' },
area: { type: String, default: '' },
city: { type: String, default: '' },
country: { type: String, default: '' },
postcode: { type: String, default: '' },
business_name: { type: String, default: '' },
ip_address: String,
status: Number,
tag_line: { type: String, default: '' },
is_influencer: Number,
wallet_id: String,
token_balance: { type: Number, default: 0 },
point_balance: { type: Number, default: 0 },
badges: [String],
membership: { type: Schema.Types.ObjectId, ref: 'Membership' },
transaction: [{ type: Schema.Types.ObjectId, ref: 'Transaction' }],
property: [{ type: Schema.Types.ObjectId, ref: 'Property' }],
reviews: [{ type: Schema.Types.ObjectId, ref: 'Review' }],
created_date: String,
});
var User = mongoose.model('User', userSchema);
var propertySchema = mongoose.Schema({
id: Number,
property_name: String,
address1: String,
area: String,
post_code: String,
category: [{ type: Schema.Types.ObjectId, ref: 'Category' }],
category_id: [Number],
property_desc: String,
property_images: String,
slug : String,
user_id: Number,
business_key: String,
user: { type: Schema.Types.ObjectId, ref: 'User' },
reviews: [{ type: Schema.Types.ObjectId, ref: 'Review' }],
status: Number,
is_claimed: Number,
created_date: String,
});
var Property = mongoose.model('Property', propertySchema);
var categorySchema = mongoose.Schema({
id: Number,
category_name: String,
status: Number,
user: { type: Schema.Types.ObjectId, ref: 'User' },
property: [{ type: Schema.Types.ObjectId, ref: 'Property' }],
created_date: String,
updated_date: String
});
var Category = mongoose.model('Category', categorySchema);
我们也在这个项目中使用 async-await。我们正在使用以下方法获取位置以获取位置数据以及用户和类别。
sortClause = {};
sortClause.user=parseInt(-1);
let properties = await Property.find({'status':{$in:[1,2]}}).populate({path: 'user',
model: 'User',select: 'first_name last_name mail contact_number'}).populate({path: 'category',
model: 'Category',select: 'category_name id'}).sort(sortClause).skip(skip).limit(perpage).exec();
因此,当我们在执行上述行之后在属性对象中获取数据时,我们正在获取属性,但是当我们按用户的属性模型列排序时,它确实可以正确获取数据。它按 objectID 排序,我们想获取用户的 first_name。
我尝试按排序顺序指定 `{'user.first_name':-1} ,但它根本不起作用。
当我们对字符串或数字列进行排序时,它工作正常,但在这里我的预期结果会有点不同,在这里我们想对 user.first_name 应用排序(在上面的示例中,用户是填充用户数据的 ObjectId 列,我想对用户的 first_name 列进行排序)我们如何根据用户的 first_name 列获取属性?有没有针对这个问题的建议。
解决方案
您可以从 mongodb 3.6及更高版本尝试以下聚合
Property.aggregate([
{ "$match": { "status": { "$in": status }} },
{ "$lookup": {
"from": "users",
"let": { "user": "$user" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$_id", "$$user" ] } } },
{ "$project": { "first_name": 1, "last_name": 1, "mail": 1, "contact_number": 1 }}
],
"as": "user"
}},
{ "$lookup": {
"from": "categories",
"let": { "category": "$category" },
"pipeline": [
{ "$match": { "$expr": { "$in": [ "$_id", "$$category" ] } } },
{ "$project": { "category_name": 1, "id": 1 }}
],
"as": "category"
}},
{ "$unwind": "user" },
{ "$sort": { "user.first_name": -1 }},
{ "$skip": skip },
{ "$limit": perpage }
])
推荐阅读
- intellij-idea - 如何通过右键单击在 Intellij 中运行 .sh?
- docker - 如何将我的代码安装到容器中,然后运行它?
- jsf - 禁用/启用primefaces keyFilter
- postgresql - Postgres 查询有时需要很长时间
- json - 使用 Helm 创建包含引用元素列表的 json 可解析 k8s 配置映射
- javascript - Node JS 很新,我正在尝试发布特定请求,但它让我出错
- python - Django REST API 身份验证
- sql-server - SQL Server 2012 程序集执行失败 - System.NullReferenceException:对象引用未设置为对象的实例
- python - 边界框选择整个图像而不是多边形
- java - Spring jpa 禁用合并