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[“Сааааааааааааа!?虽然在现实中它是一个类似于字符串的“单位”!**所以不存在相等([“Саафааааааааааааааааа