【发布时间】: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