【问题标题】:find array of objects with only matched object in subarray mongoose?在子数组猫鼬中找到只有匹配对象的对象数组?
【发布时间】:2022-01-16 12:51:08
【问题描述】:

我正在尝试获取具有匹配 id 的对象数组,并且仅包含具有匹配属性 size 和 model 的子数组 product_price 对象?

      product_name: {
        type: String,
        required: true,
      },
      service_hourly_price: {
        type: Number,
        required: true
      },
      product_price: [{
        model:{
          type: String,
          enum:['Euro','Japanese']
        },
        size:{
          type: String,
          enum: ['S','M','L','XL']      
        },
        price:{
          type: Number,
          required: true,
        }
      }],
    

尝试这样查询:

ProductSchema.aggregate( [
    {$match: { _id: { 
      $in: _id.map(function(_id){ return new mongoose.Types.ObjectId(_id) })
    }}},
    { $match : { product_price : {model : 'Euro' , size: 'S'}}}
    ])

我怎样才能达到这样的结果:

products:{
  _id: new ObjectId("61b3ab3ceba5bc724d754929"),
  product_name: 'Basic Service',
  service_hourly_price: 25,
  product_price: [
    {
      _id: new ObjectId("61b3ab3ceba5bc724d75492a"),
      size: 'S',
      model: 'Euro',
      price: 100
    }
  ]
},
{
  _id: new ObjectId("61b3aa88eba5bc724d7548fb"),
  product_name: 'Horn',
  service_hourly_price: 5,
  product_price: [
    {
      _id: new ObjectId("61b3aa88eba5bc724d7548fc"),
      size: 'S',
      model: 'Euro',
      price: 110
    }
  ]
}

product_price 中必须只包含一个匹配对象。

【问题讨论】:

  • 能否提供一个示例数据库文档
  • 您的 product_price 是否有理由成为一个数组?你只有一个对象吗?

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

我不确定为什么你的 product_prize 是一个只有一个对象的数组,你可以删除那里的数组,从而删除聚合中的 $unwind ,但现在这对你有用:

ProductSchema.aggregate( [
    {$match: { 
      _id: { 
      $in: _id.map(function(_id){ return new mongoose.Types.ObjectId(_id) })
    }}}, {
    '$unwind': {
      'path': '$product_price'
    }
  }, {
    '$match': {
      'product_price.model': 'Euro', 
      'product_price.size': 'S'
    }
  }
])

Here try it out

这里是 mongo Compass 的证明:

【讨论】:

  • 是的。在结果数组中,我们只有一个对象。去掉数组就ok了
  • 谢谢。它对我有用
猜你喜欢
  • 2022-01-24
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2015-12-28
  • 2021-05-06
  • 2016-02-05
  • 1970-01-01
相关资源
最近更新 更多