mongo聚合匹配expr不起作用,但是expr似乎很好

问题描述

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

有趣的是$exprname的{​​{1}}永不匹配,结果为零,但是$match中相同的$ expr给出了预期的结果({ {1}}和$projection值。

甚至对其他字段也使用相同的true,例如来自同一子文档的false效果很好。

其他$ expr也可以正常工作,请参见$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"},-1]}},{"$expr": {"$gt": [{"$indexOfCP": [{"$toLower": "$name"},"e"]},{"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"},-1] }} },// { "$facet": { [...] }} ]) 的所有内容都是字符串),语句顺序(无关紧要)和mongo索引(无关紧要)以及$ expr具有不同类型(例如日期)就像“ a_date”中一样),使用python motor / pymongo / SON和mongo shell(Robo3T),...

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

解决方法

您误解了$ expr的工作原理,$ expr允许您在常规查询中使用聚合表达式。将其放在$ match中确实没有意义。只需尝试取消$ expr文档中的条件,它就会起作用。