首页 > 解决方案 > mongo 聚合匹配 expr 不起作用,但 expr 似乎很好

问题描述

我有一个 Mongo 集合,我正在使用 $expr 中的自制 substr 匹配从数组中搜索展开的子文档列表,看起来像 {"$expr": {"$gt": [{"$indexOfCP": [{"$toLower": "$ok_name"}, "be"]}, -1]}}

有趣的是$exprfor namein$match从不匹配,as 给出零结果,但 a 中的相同 $expr$projection给出预期结果(truefalse值)。

甚至更有趣的是$expr,对于其他领域,例如ok_name,来自同一个子文档的工作正常。

其他 $expr 也可以正常工作,请参阅a_date.

整个命令看起来有点像这样,为了清楚起见,这里缺少一些部分:

db.getCollection('foo').aggregate([
  {"$match": {"mergedAt": {"$exists": true}}}, 
  {"$unwind": {"path": "$bar", "includeArrayIndex": "arrayIndex"}}, 
  { "$match": {
    "$and": [
        {"$expr": {"$gt": [{"$indexOfCP": [{"$toLower": "$ok_name"}, "be"]}, -1]}},
        {"$expr": {"$gt": [{"$indexOfCP": [{"$toLower": "$name"}, "e"]}, -1]}}, 
        {"a_date": {"$gte": ISODate("2020-03-01 00:00:00+00:00")}},
    ]
  }
}, 
{"$addFields": {"lastModified_doc": "$lastModified"}}, 
{"$replaceRoot": {"newRoot": {"$mergeObjects": ["$$ROOT", "$bar"]}}}, 
// {"$unset": [ ... ]
}, 
 { $project: {
"name": 1 , 
"my_expr":  {"$gt": [ {"$indexOfCP": [{"$toLower": "$name"}, "e"]}, -1] }} },
// { "$facet": { [...] }}
])

那么,为什么 expr 在某些领域起作用而在其他领域不起作用,但总是在$projection舞台上?

我检查了类型(我使用$indexOfCP的所有内容都是字符串)、语句顺序(无关紧要)和 mongo 索引(无关紧要),以及不同类型的 $expr(例如“a_date”中的日期),使用python motor/pymongo/SON 和一个 mongo shell (Robo3T), ...

什么会导致匹配 indexOfCP 的 expr 每次都失败?

标签: pythonmongodb-querymongo-shell

解决方案


您误解了 $expr 的工作原理, $expr 允许您在普通查询中使用聚合表达式。把它放在 $match 里面真的没有意义。只需尝试从 $expr 文档中取消嵌套条件,它应该可以工作。


推荐阅读