node.js - Mongoose 按条件填充字段排序文档

标签 node.js mongodb mongoose database-design

我有两个模式

车辆架构:

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);

促销 架构:

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 并且其中一个 Promotion 处于事件状态(start_at 小于 Date.nowend_at 大于 Date.now)

1- 我需要获得所有具有一项促销事件(现已激活)的车辆,并按 start_at

对其进行排序

2- 是否可以添加名称为 is_promotion 的虚拟字段并将其设置为 true(如果有事件促销)?

注意:有些Vehicle可能没有任何Promotion

最佳答案

您可以使用 $lookup .

按车辆 ID 查找促销以获取标准并排序和限制以获取最新促销。

$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]}
  }}
])

关于node.js - Mongoose 按条件填充字段排序文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56617034/

相关文章:

javascript - 无法向 Google 智能显示屏发送推送通知

mongodb - Mongoose 查询字段不包含子字符串

node.js - 将 Mongo ObjectId 保存到另一个文档中

regex - 使用正则表达式在 mongodb 中搜索查询

authentication - node.js 的用户身份验证库?

node.js - Nodejs 解密 AES256 需要帮助

linux - 尝试启动 mongodb 时出错

node.js - 使用 Node.js 和 MongoDB 将图像从外部 URL 保存到 S3

javascript - mongoose forEach循环并一一更新文档

node.js - 格式化从 MongoDB/Mongoose group by 返回的对象