如何在聚合函数mongodb上基于字符串长度进行查询

时间:2016-08-23 03:45:42

标签: mongodb mongodb-query

我有这样的产品系列:

{
  _id: 'prod_id_1',
  type: SIMPLE,
  name: 'Product Simple 1',
  barcode: '00000004'
},
{
  _id: 'prod_id_2',
  type: SIMPLE,
  name: 'Product Simple 2',
  barcode: '00000005'
},
{
  _id: 'prod_id_3',
  type: VARIED,
  name: 'Product Varied 1',
  variants: [
     {
       id: 'variant_aqua_base_m_size', 
       name: 'Variant AquaM', 
       barcode: '121200000005'
     },
     {
       id: 'variant_aqua_base_m_size', 
       name: 'Variant AquaM', 
       barcode: '00000007'
     }
  ]
},
{
  _id: 'prod_id_4',
  type: SIMPLE,
  name: 'Product Simple 4',
  barcode: '121200000008'
}

我想显示所有条形码长度为8的产品。如果只是产品简单,我可以使用$ where,例如:

db.product.find({$where: "this.barCode.length == 8", 'barCode': {$exists: true}})

如果我想展示不同的产品,我必须解开变种。但是,我没有在聚合函数中找到像$ where这样的运算符。我应该根据字符串长度使用什么操作符来查找条形码?

2 个答案:

答案 0 :(得分:2)

最后,我有答案。

db.product.aggregate([
{"$project":{ 
         "u_barCode": {
             "$let": {
                 "vars": {
                     "variantBarCode": {
                         "$cond": [
                             {"$eq": ["$variants", null]},
                             [], 
                             {"$ifNull": ["$variants.barCode", [null]]}
                         ]
                     }, 
                     "barCode": {"$ifNull": ["$barCode", null]}
                 }, 
                 "in": {
                     "$cond": [ 
                         {"$eq": ["$$variantBarCode", [null]]}, 
                         {"$map": {
                             "input": {"$literal": [null]}, 
                             "as": "el", 
                             "in": "$$barCode"
                         }}, 
                         "$$variantBarCode"
                     ]
                 }
             }
         },
        "type" : "$type"
     }
 },
 {$unwind : "$u_barCode"},
 {$match: {u_barCode: {$regex: '^[0-9]{8}$', $options: 'm'}}},
])

答案 1 :(得分:1)

嗯,我相信你可以使用OR条件,比如

db.product.find({"$or": [{"barCode.length == 8"}, {"variants.barCode.length == 8"}], 'barCode': {$exists: true}})