【问题标题】:mongo $cond with subfields带有子字段的mongodb $cond
【发布时间】:2021-10-16 04:11:23
【问题描述】:

我的数据库中有以下数据(删除了不相关的字段)。

{
  "multiclass": {
    "datasetname": {
      "labels": {
        "al": {
          "timestamp": {
            "$date": {
              "$numberLong": "1628689826073"
            }
          },
          "classification": "wrong_ingredient"
        },
        "bob": {
          "timestamp": {
            "$date": {
              "$numberLong": "1628765248010"
            }
          },
          "classification": "wrong_ingredient"
        }
      }
    }
  }
}

我想知道一个没有被 candice 给标签的文档是否已经被其他贴标签的人给了足够数量的标签。在这种情况下,al 和 bob 都标记了它,所以它应该返回 2,小于 3,所以应该包含这个文档。 这是我写的查询。

{
  "multiclass.datasetname.labels.candice": {$exists: false},
  $expr: {
    $lt: [
      {
        $cond: {
          if: {"multiclass.datasetname.labels": {$exists: true}},
          then: {$size: {$objectToArray: "$multiclass.datasetname.labels"}},
          else: 0
        }
      },
      3
    ]
  }
}

运行这会导致错误FieldPath field names may not contain '.'. Consider using $getField or $setField.(它指的是if: {"multiclass.datasetname.labels": {$exists: true}}, 行而不是"multiclass.datasetname.labels.candice": {$exists: false} 行) 我不知道这个错误试图传达什么,除非它认为我正在尝试访问名称中带有点的元素,而不是尝试访问带有子字段和子字段的字段?

我在 SO 上看到的带有相关错误的问题,例如 this one 给出了针对特定问题的解决方法,而不是解释它为什么不起作用,这使得很难适用于我的情况。

所以我的问题主要是为什么我不能在 $expr 内使用点,但我可以在它之外使用点? 如果你能回答这个问题,解决方案也会很有用,但更重要的是我知道它为什么不起作用。

【问题讨论】:

  • 天哪,是的。它确实解决了我的问题。它没有解释为什么我想这样做的方式不起作用,但它确实解决了问题。

标签: mongodb mongodb-query


【解决方案1】:

我不能在字段路径中使用点的原因是它是表达式的一部分。当字段路径是表达式的一部分时,它必须以 $ 为前缀。见this

在表达式之外,可以使用不带美元符号的点表示法。这回答了为什么它是错误的,但对于如何解决问题的解决方案,请参阅 ISAE 留在 cmets 中的链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2021-10-18
    • 2014-07-19
    • 2019-08-07
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多