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 给出预期结果(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),...
什么会导致match中带indexOfCP的expr每次都失败?
你误解了 $expr 的工作原理,$expr 允许你在普通查询中使用聚合表达式。把它放在 $match 里面真的没有意义。只需尝试从 $expr 文档中取消嵌套条件,它应该可以工作。
我有一个 Mongo 集合,我正在使用 $expr 中的自制 substr 匹配项从数组中搜索展开的子文档列表,看起来像
{"$expr": {"$gt": [{"$indexOfCP": [{"$toLower": "$ok_name"}, "be"]}, -1]}}
有趣的是 $match
中的 name
的 $expr
永远不会匹配,因为给出零结果,但是 $projection
中的相同 $expr 给出预期结果(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),...
什么会导致match中带indexOfCP的expr每次都失败?
你误解了 $expr 的工作原理,$expr 允许你在普通查询中使用聚合表达式。把它放在 $match 里面真的没有意义。只需尝试从 $expr 文档中取消嵌套条件,它应该可以工作。