Mongodb &引用;虚线字段名称仅允许位于顶层;做$cond时

Mongodb &引用;虚线字段名称仅允许位于顶层;做$cond时,mongodb,mongodb-query,aggregation-framework,projection,Mongodb,Mongodb Query,Aggregation Framework,Projection,我正在用一个项目用一个条件用一个条件做一个聚合。像这样的 假设文件: {outter:{ inner1:"blah", innerOther:"somethingelse" }} 聚合: db.collection.aggregate([{ $project : { "outter.inner1":1, "outter.inner2":{ $cond : if:{"outter.innerOther":{$exists:tr

我正在用一个
项目用一个
条件用一个
条件做一个
聚合
。像这样的

假设文件:

{outter:{
    inner1:"blah",
    innerOther:"somethingelse"
}}
聚合:

db.collection.aggregate([{
   $project : {
       "outter.inner1":1,
       "outter.inner2":{
          $cond : if:{"outter.innerOther":{$exists:true}},
                  then:{"blah":"blah"},
                  else:{"blah":"blah"}
       }
   }
}])
运行此命令时,我得到一个错误:
exception:pointed字段名只允许出现在
if
条件语句的顶层
(我尝试用
if:true
替换if,聚合有效)

这是虫子吗?有没有一个变通办法,不用做一个完整的其他项目,只需在没有点的情况下获得可用的字段

编辑

所以我找到了一个解决方法,但仍然想看看这是否是预期的行为。解决方法是通过
$let
在投影中使用变量。另外,似乎
$exists
不是有效的
表达式
,因此还必须进行以下更改

db.collection.aggregate([{
   $project : {
       "outter.inner1":1,
       "outter.inner2":{
          $let :{
              vars:{innerOther:{$ifNull:["$outter.innerOther", "absent"]}},
          }
          $cond : if:{$eq:["$$innerOther","absent"]},
                  then:{"blah":"blah"},
                  else:{"blah":"blah"}
       }
   }
}])
首先,不能使用,因为它仅在带有运算符的表达式中或在方法中有效。也就是说,您可以在
if
条件中使用,但您需要在第一次查询中缺少的。此外,不能将文本对象键/值对作为或表达式的值返回,因为它不是有效的,需要改用

现在一种方法就是使用操作和离子。当然,
$ifNull
条件运算符返回字段的当前值(如果存在)或替换表达式

db.collection.aggregate([
{$project:{
“外部内部1”:1,
“outter.inner2.blah”:{
$let:{
变量:{
“Outteriner2”:{
$ifNull:[“$outter.innerOther”,“缺席”]
}
}, 
在:{
$cond:[
{$eq:[“$$outteriner2”,“缺席”]},
“废话”,
“废话”
]
}
}
}
}}
])
另一种方法是使用两个离子级

db.collection.aggregate([
{$project:{
“inner1”:“$outter.inner1”,
“第2条”:{
$ifNull:[“$outter.innerOther”,“缺席”]
}
}}, 
{$project:{
“outter.inner1”:“$inner1”,
“outter.inner2.blah”:{
$cond:[
{$eq:[“$inner2”,“缺席”]},
“废话”,
“废话”
]
}
}}
])
两个查询都会产生如下结果:

{
“_id”:ObjectId(“5632713c8b13e9fb9cc474f2”),
“outter”:{
“inner1”:“废话”,
“第2条”:{
“废话”:“废话”
}
}
}
编辑:

$cond
运算符中允许使用“点符号”。例如,下面的查询使用“点表示法”

db.collection.aggregate([
{$project:{
“外部内部1”:1,
“outter.inner2.blah”:{
$cond:[
{$eq:[“$outter.innerOther”,“somethingelse”]},
“另一件事”,
“没什么”
] 
} 
}}
])
和产量:

{
“_id”:ObjectId(“56379b020d97b83cd1506650”),
“outter”:{
“inner1”:“废话”,
“第2条”:{
“废话”:“另一件事”
}
}
}
hmmm。。。。由此:

Model.aggregate([
                    {
                        $project: {
                            name: 1,
                            "indexes.name":{
                                $cond: {
                                    if: {$eq:["$indexes.name",'стафилококки']},
                                    then: "$indexes.name",
                                    else: null
                                }
                            },
                            "indexes.units":1
                        }
                    }
                ], callback)
始终为name.index返回“null”

[ 
   { _id: 564c6a5991b08dd017c2bd23,
     name: ' воздух ',
     indexes: [ [Object] ] },
   { _id: 564c6cf091b08dd017c2bd24,
     name: 'repa ',
     indexes: [ [Object] ] },
]
其中索引为:

[ { units: 'fvf', name: null } ]
[ { units: 'КОЕ', name: null } ]

“outter”是数组吗?请出示您的文件好吗?Outter是一个子文件。我已经研究了上面的案例。难以置信,**但是在数组中转换为“$indexes.name”$cond[“Сааааааааааааа!?虽然在现实中它是一个类似于字符串的“单位”!**所以不存在相等([“Саафааааааааааааааааа