在子数组猫鼬中找到只有匹配对象的对象数组?

Posted

技术标签:

【中文标题】在子数组猫鼬中找到只有匹配对象的对象数组?【英文标题】: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 是否有理由成为一个数组?你只有一个对象吗? 【参考方案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了 谢谢。它对我有用

以上是关于在子数组猫鼬中找到只有匹配对象的对象数组?的主要内容,如果未能解决你的问题,请参考以下文章

从猫鼬中的数组对象中选择特定项目

如何在无模式猫鼬中添加对象数组?

如何填充数组内的对象和猫鼬中的另一个数组中的所有用户字段

如何通过一次调用将一组对象推送到猫鼬中的数组中?

如何通过一次调用将一组对象推送到猫鼬中的数组中?

如何在猫鼬中动态地将值推入对象的属性?