Py学习  »  MongoDB

Mongodb查询与if条件匹配形成多个空值字段

Rahul Anand • 4 年前 • 843 次点击  

我有一个json . sender.client和receiver.client不能总是值

下面是示例json的一部分:

{"sender" : {
        "id" : "5d95", 
        "name" : "Name1", 
        "phone" : "123456",
        "client" : "spec1"
    }, 
    "receiver" : {
        "id" : "5d95683", 
        "name" : "name2", 
        "phone" : "342235", 
        "client" : "spec1"
    }
}

{"sender" : {
        "id" : "52fes", 
        "name" : "Name2", 
        "phone" : "3334321",
        "client" : "spec2"
    }, 
    "receiver" : {
        "id" : "5efse", 
        "name" : "name3", 
        "phone" : "7353344", 
        "client" : "spec1"
    }
}

我的目标是过滤条件 (sender.client=spec1或receiver.client=spec1) 然后显示所有字段,即如果客户端名称匹配,则必须显示其他必需字段。我一直在尝试$project和$match,但是match不使用$cond,所以我选择了$eq的替代路径,但这并不能帮助我过滤掉我的需求。以下是我的代码:

    { 
        "$project" : {
            "sendername" : {
                "$cond" : {
                    "if" : {
                        "$eq" : [
                            "$sender.client", 
                            "spec1"
                        ]
                    }, 
                    "then" : "$sender.name", 
                    "else" : 0.0
                }
            }, 
            "sendername1" : {
                "$cond" : {
                    "if" : {
                        "$eq" : [
                            "$receiver.client", 
                            "spec1"
                        ]
                    }, 
                    "then" : "$receiver.name", 
                    "else" : 0.0
                }
            }
        }
    }

我想在$eq的空间中使用$match。我该如何完成?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56141
 
843 次点击  
文章 [ 1 ]  |  最新文章 4 年前
prasad_
Reply   •   1 楼
prasad_    4 年前

这个 $match $expr 可以根据条件进行筛选: (sender.client = spec1 or receiver.client = spec1)

我的目标是过滤条件,如果(sender.client=spec1或 receiver.client=spec1)然后显示所有字段,即

您可以添加进一步的筛选器以匹配 name 字段(有两个“name”字段, sender.name receiver.name

var queryFilter = { $cond: {
                      if: { $or: [ 
                               { $eq: [ "$sender.client", "spec1" ] },
                               { $eq: [ "$receiver.client", "spec1" ] }
                            ]
                      },
                      then: true,
                      else: false
                 }
};

db.test.aggregate( [
{
    $match: { 
              $expr: { $eq: [ queryFilter,  true ],
              $or: [ { "sender.name" : "name3" }, { "receiver.name" : "name3" } ]  } 
    }
}
] )

匹配筛选器为: $expr: {...} $or: [...] .

$project )之后 $匹配