Мангуста сортировать документ по заполненному полю с условиями - PullRequest
3 голосов
/ 16 июня 2019

у меня две схемы

vehicle схема:

const VehicleSchema = new Schema({
title: {
    type: String,
    required: true
},
price: {
    type: Number,
    required: true
},
);
VehicleSchema.virtual('promotions', {
   ref: 'Promotion',
   localField: '_id',
   foreignField: 'vehicle',
   justOne: true
});
export default mongoose.model('Vehicle', VehicleSchema);

Promotion Схема:

const PromotionSchema = new Schema({
    start_at: {
        type: Date,
        required: true
    },
    end_at: {
        type: Date,
        required: true
    },
    vehicle: {
        type: Schema.Types.ObjectId,
        ref: 'Vehicle'
    },
    amount:{
        type:Number,
        required:true
    },
});
export default mongoose.model('Promotion', PromotionSchema);

каждые vehicle имеют мульти Promotion, и одно из Акции активно (start_at меньше Date.now и end_at больше Date.now)

1 - мне нужно получить все транспортные средства с одной рекламной акцией (которая сейчас активна) и отсортировать ее по start_at

2 - возможно ли добавить виртуальное поле с именем is_promotion и установить его в значение true, если активна акция?

примечание: возможно, что некоторые Vehicle не имеют Promotion

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Вы можете использовать $lookup.

$ поиска по идентификатору транспортного средства для критериев и сортировки и ограничения, чтобы забрать последнюю акцию.

$addFields для добавления поля is_promotion.

VehicleSchema.aggregate([
  {"$lookup":{
    "from":"Promotion",
    "let":{"_id":"$_id"},
    "pipeline":[
      {"$match":{
        "start_at":{"$lt":Date.now},
        "end_at":{"$gt":Date.now},
        "$expr":{"$eq":["$vehicle","$$_id"]}
      }},
      {"$sort":{"start_at":-1}},
      {"$limit":1}
    ],
    "as":"activepromotion"
  }},
  {"$addFields":{
    "is_promotion":{"$gt":[{"$size":"$activepromotion"},0]}
  }}
])
0 голосов
/ 16 июня 2019

# Попробуйте получить start_at нашей VehicleSchema, затем используйте find (), чтобы найти его в поле VehicleSchema по всей PromotionSchema. #

PromotionSchema
.findOne({ start_at: {
        type: Date
    } })
.populate('VehicleSchema') 
.exec(function (err, PromotionSchema) {
  if (err) return handleError(err);
  console.log('The total vehicles %s', PromotionSchema.VehicleSchema.vehicle);
.short(Date)
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...