我有这样的产品系列:
{
_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这样的运算符。我应该根据字符串长度使用什么操作符来查找条形码?
答案 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}})