【问题标题】:String field value length in array in mongoDBMongoDB中数组中的字符串字段值长度
【发布时间】: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


【解决方案1】:

content.classes.number 是一个数组字段而不是字符串,这就是您的查询无法工作的原因。

这里的一个解决方案是使用$arrayElemAt 运算符,但不知道要检查哪个元素。但例如,我在这里使用0th 元素。

db.Basis.find({
  "content.classes.number": { "$exists": true }, 
  "$expr": { "$gt": [{ "$strLenCP": { "$arrayElemAt": ["$content.classes.number", 0] }}, 16 ] }
})

【讨论】:

  • 有点飞跃假设数组只有一个元素。我知道这个问题只显示一个,但应该假定 Array 表示 "an Array" 并被视为这样。另一方面,如果一个问题专门询问“第一个数组元素”,那么$arrayElemAt 就可以了。但这很可能不是实际情况。有用于处理所有可能的数组元素的运算符。请参阅对问题的评论。
  • @NeilLunn 嗯,我知道 OP 对他的问题有点不清楚。这就是为什么我写了但不知道你想检查哪个元素并等待他的回复。 :-) 我认为您的评论应该是答案,因为它似乎符合 OP 的需要。
  • @Anthony Winzlet NeilLunn 绝对正确。但不幸的是版本 3.4.3 gyazo.com/8031da7305191d3bdfd02ca87abafdd5
  • @СомаТха 是的,Neil Lunn 永远不会错。我只是在等你的回复。我会根据您的需要更新我的答案,但您需要更清楚。
  • @Anthony Winzlet 你的回答确实有帮助,但它并没有触及数组中的所有案例。事实证明,生产中的版本 3.4.3 (
猜你喜欢
  • 2015-06-17
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多