如何获取嵌套在另一个字段中的字段的字符长度?它是在一个数组中。例如:
{
"_id" : ObjectId("687e1db"),
"content" : {
"ods" : "1102223000241",
"startDate" : ISODate("2017-05-11T12:00:00Z"),
"classes" : [
{
"driveNumber" : "9999078900007091",
"number" : "00107605829357",
"sId" : "0000000005009593"
}
],
"user" : "SoftLogic",
},
"level" : 2
}
我想在
content.classes.number
字段中获取长度大于16个字符的样本。
在进行请求时,我是参考MongoDB中字符串字段值长度的指引操作的。
要么这个请求不适用于这种情况,要么我做错了什么。db.Basis.find({
"content.classes.number": { "$exists": true },
"$expr": { "$gt": [ { "$strLenCP": "$content.classes.number" }, 16 ] }})
我遇到了错误:https://gyazo.com/d2849406d36364de94d6ea89eff1c2b6
我尝试了不止这些选项。
更新:mongo版本为3.4.3。
"classes"
实际上是一个数组,因此任何字段路径表达式,如$content.classes.number
,也会产生与匹配值相对应的数组。您的问题仅显示单个数组成员,因此不清楚在结构中使用数组是不正确的,它应该是单数形式,还是您实际上希望这是一个数组,并且确实可以有多个成员。 - Neil Lunn$expr
应该是"$expr": { "$anyElementTrue": { "$map": { "input": "$content.classes.number", "in": { "$gt": [ { "$strLenCP": "$$this" }, 16 ] } } } }
。这基本上与"$where": "this.content.classes.some(e => e.number.length > 16)"
作为替代的$where
表达式是相同的。虽然语法更加简洁,但$expr
应该比$where
处理速度更快。 - Neil Lunn"$expr": { "$anyElementTrue": { "$map": { "input": "$content.classes.number", "in": { "$gt": [ { "$strLenCP": "$$this" }, 16 ] } } } }
。它出现在版本3.6.9中。但事实证明,在版本3.4.3上安装它是必要的,并且在这里 https://gyazo.com/8031da7305191d3bdfd02ca87abafdd5。 - Сома Тха$expr
文档确实告诉您“自版本3.6起新功能”,这就是为什么上面显示的两种情况,因为如果您的MongoDB版本不是3.6或更高版本,那么您想要的是$where
表达式。请注意,从本帖发布之日起不到5个月的时间里,3.4版本将不再获得官方支持。 - Neil Lunn