mongo 聚合匹配 expr 无效,但 expr 似乎没问题

mongo aggregate match expr not working, but expr seems fine

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

有趣的是 $match 中的 name$expr 永远不会匹配,因为给出零结果,但是 $projection 中的相同 $expr 给出预期结果(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),...

什么会导致match中带indexOfCP的expr每次都失败?

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