mongodb:检查聚合条件

时间:2018-02-05 05:22:12

标签: mongodb mongodb-query

我正在使用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

但如果存在,则脚本会转到下一个文档并再次检查。

1 个答案:

答案 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] } ] }
        }
    }
])