我有一个Mongo集合,我正在使用$ expr中的自制substr匹配从数组中搜索未展开的子文档列表,就像
{"$expr": {"$gt": [{"$indexOfCP": [{"$toLower": "$ok_name"}, "be"]}, -1]}}
有趣的是$expr
中name
的{{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每次失败?
答案 0 :(得分:1)
您误解了$ expr的工作原理,$ expr允许您在常规查询中使用聚合表达式。将其放在$ match中确实没有意义。只需尝试取消$ expr文档中的条件,它就会起作用。