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

时间:2020-11-12 11:26:38

标签: python mongodb-query mongo-shell

我有一个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"}, "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": { [...] }} ]) 的所有内容都是字符串),语句顺序(无关紧要)和mongo索引(无关紧要)以及$ expr具有不同类型(例如日期)就像“ a_date”中一样),使用python motor / pymongo / SON和mongo shell(Robo3T),...

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

1 个答案:

答案 0 :(得分:1)

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