我正在使用mongodb 3.6。我的馆藏中有很多文档。在文档中我没有任何域字段。我为某些文档创建域。 现在我想使用聚合来过滤这个集合。这意味着,我希望那些没有域的文档作为字段。
db.Events.aggregate([
{$project : {
Domain : {$filter: {
input: "$Domain",
cond:{if: {Domain : {$exists: false}}, then: {"$BusinessCode": 1} }}}
}
}
],{
allowDiskUse: true
})
当我执行此脚本时出现错误:
Assert: command failed: {
"ok" : 0,
"errmsg" : "Unrecognized expression '$exists'",
"code" : 168,
"codeName" : "InvalidPipelineOperator"
} : aggregate failed
$exists
似乎不支持$filter expression
。
我怎么能这样做?
另一个问题是:我可以像这样使用2 $项目:
db.Events.aggregate([
{$project : {
Domain : {$filter: {
input: "$Domain",
cond:{if: {Domain : {$exists: false}}, then: {"$BusinessCode": 1} }}}
}
},
{
$match : {BusinessCode: /(([1-2]?[0-9])-([0-9]*)-([0-9]*)-([0-9]*)-([0-9]*)-([0-9]*)-([0-9]*))/}
},
{
$project : {BusinessCode : {$arrayElemAt:[{$split : ["$BusinessCode", "-"]},0]}}
},
{
$addFields: {"Domain": "$BusinessCode"}
},
],{
allowDiskUse: true
})
我想检查,具体字段是否存在于文档中。如果不存在,BusinessCode预测和其他东西..
***************************编辑****************
这是我的文件样本:
"DeviceId" : "xxxxxxx",
"UserId" : UUID(""),
"UserFullName" : "test-user",
"SystemId" : "com.messaging",
"SystemTitle" : "message",
"EventId" : "messaging.message",
"EventTitle" : "test",
"EventData" : [],
"BusinessCode" : "1-2-4-4-5-6-9",...
执行此脚本后,我希望" Domain"附加到我的文档:
"EventTitle" : "test",
"EventData" : [],
"BusinessCode" : "1-2-4-4-5-6-9"
"Domain": "1" // 1 is first number of BusinessCode that splitted
但如果存在域,则脚本会转到下一个文档并再次检查。
答案 0 :(得分:1)
所以你在SQL中寻找像COALESCE这样的东西,它在MongoDB中被称为$ifNull
。例如:
db.Events.save({Domain: "4"})
db.Events.save({BusinessCode: "1-2-4-4-5-6-9"})
db.Events.aggregate([
{
$project: {
Domain: {
$ifNull: [ "$Domain", { $arrayElemAt: [ { $split : ["$BusinessCode", "-"] },0] } ] }
}
}
])