MongoDB Atlas Search中如何用$search替代含$in的$match查询
将MongoDB $match多字段多值查询转换为$search
直接给出转换后的$search查询代码:
{ "$search": { "compound": { "must": [ { "compound": { "should": [ {"equals": {"value": ObjectId("5f3d6c51f5b2ed74fe93dd60"), "path": "customer"}}, {"equals": {"value": ObjectId("5c221b4e4d17f1734806b4a5"), "path": "customer"}} ], "minimumShouldMatch": 1 } }, { "compound": { "should": [ {"equals": {"value": "carrier1", "path": "carrier"}}, {"equals": {"value": "carrier2", "path": "carrier"}}, {"equals": {"value": "carrier3", "path": "carrier"}} ], "minimumShouldMatch": 1 } }, { "compound": { "should": [ {"equals": {"value": "late", "path": "status"}}, {"equals": {"value": "idle", "path": "status"}}, {"equals": {"value": "delivered-late", "path": "status"}} ], "minimumShouldMatch": 1 } }, { "range": { "path": "createDate", "gte": ISODate("2023-06-01T04:00:00.000Z"), "lte": ISODate("2023-07-01T03:59:59.999Z") } } ] } } }
逻辑对应说明
- 原
$match中的$and等价于$search的compound.must,所有子条件必须同时满足。 - 单个字段的
$in逻辑,用嵌套的compound.should实现:把该字段的每个可选值写成equals查询,设置minimumShouldMatch:1表示只要匹配其中一个值即可。这个嵌套的compound整体放在外层must里,保证该字段的$in条件必须被满足。 - 日期范围的
$gte和$lte直接用$search的range操作符实现,指定字段路径和对应边界值即可。
注意:使用ObjectId时要包裹ObjectId(),日期要包裹ISODate(),和MongoDB原生语法保持一致。
内容的提问来源于stack exchange,提问作者MLR
相关产品推荐
相关产品推荐

