python - mongo 聚合匹配 expr 不起作用,但 expr 似乎很好
问题描述
我有一个 Mongo 集合,我正在使用 $expr 中的自制 substr 匹配从数组中搜索展开的子文档列表,看起来像
{"$expr": {"$gt": [{"$indexOfCP": [{"$toLower": "$ok_name"}, "be"]}, -1]}}
有趣的是$expr
for name
in$match
从不匹配,as 给出零结果,但 a 中的相同 $expr$projection
给出预期结果(true
和false
值)。
甚至更有趣的是$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 每次都失败?
解决方案
您误解了 $expr 的工作原理, $expr 允许您在普通查询中使用聚合表达式。把它放在 $match 里面真的没有意义。只需尝试从 $expr 文档中取消嵌套条件,它应该可以工作。
推荐阅读
- python - 如何订购堆叠的条形图以在底部具有最大的块?Python
- url - Istio VirtualService - 损坏的 URL
- pandas - 如何避免熊猫数据框 concat 中不必要的多索引条目?
- angular - Resolver 中的链相关 Observables
- ruby-on-rails - ArgumentError UTF-8 中的无效字节序列
- sql - 插入到具有多项选择的表中,包括与两个表不同的选择
- javascript - 检查用户是否已存在于 mongodb 和护照中
- python - 将多维数组转换为熊猫数据框
- reactjs - 反应钩子和 fetch() 建议
- php - 为什么“mb_convert_encoding() 期望参数 1 是字符串,给定数组”,如果在 php.net 上它接受数组?