Как мы можем выполнить сортировку по столбцу ObjectId в mongodb, используя mongoose с expressjs-nodejs? - PullRequest
0 голосов
/ 27 августа 2018

Мы структурированы в одной точке 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);

Мы также используем асинхронныйждать этого проекта.мы выбираем местоположения, используя метод ниже, чтобы получить данные о местоположении, а также пользователя и категории.

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, и мы хотели бы получить имя пользователя по имени.

Я попытался указать `{'user.first_name': - 1} в порядке сортировки, но он не работает вообще.

Когда мы сортируем по строковому или числовому столбцу, он работает нормально, но здесь мой ожидаемый результат будет немного другим. Здесь мы хотели бы применить сортировку к user.first_name (Здесь в приведенном выше примере user - это столбец ObjectId, который заполняет данные пользователя.и я хотел бы отсортировать по столбцу first_name пользователя) Как мы можем получить свойства на основе столбца user_name пользователя?Есть ли какие-либо предложения по этой проблеме.

1 Ответ

0 голосов
/ 28 августа 2018

Вы можете попробовать ниже агрегации от 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 }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...