【发布时间】:2019-08-30 01:10:47
【问题描述】:
如何从嵌套在另一个字段中的字段中获取字符长度?它在一个数组中。例如:
{
"_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 个。
在提出请求时,我是由 String field value length in mongoDB 指导的
要么这个请求不适合这种情况,要么我做错了什么。
db.Basis.find({
"content.classes.number": { "$exists": true },
"$expr": { "$gt": [ { "$strLenCP": "$content.classes.number" }, 16 ] }})
我收到错误:https://gyazo.com/d2849406d36364de94d6ea89eff1c2b6
我不仅尝试了这些选项。
UPD mongo 版本 3.4.3
【问题讨论】:
-
该错误意味着它所说的
"classes"实际上是一个数组,因此任何像"$content.classes.number"这样的字段路径表达式也会产生一个匹配值的数组。您的问题仅显示单个数组成员,因此不清楚您在结构中使用数组是否 incorrect 并且它应该是单数,或者您是否真的 mean 这是一个数组,确实可以有多个成员。 -
如果它实际上应该是一个数组,那么
$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处理得更快,尽管语法更简洁。 -
@NeilLunn 谢谢!不只是一项。所以你肯定是对的,答案是:
"$expr": { "$anyElementTrue": { "$map": { "input": "$content.classes.number", "in": { "$gt": [ { "$strLenCP": "$$this" }, 16 ] } } } }。它出现在 3.6.9 版本中。但事实证明,有必要安装在 3.4.3 版本和那里gyazo.com/8031da7305191d3bdfd02ca87abafdd5 -
为什么不能更新你的版本?较新的版本总是“cubby”。所以还是用升级版比较好。
-
是的,我同意。这个版本对我来说不是本地的,它正在生产中。需要了解是否有满足这些条件的数据。
标签: arrays mongodb mongodb-query